0

ツリーの視覚化/描画用に独自に記述した「ツリー フレームワーク」座標を使用して計算します (したがって、ノードと接続の座標を計算します)。私はpython 3.9で作業しており、ツリーの描画にmatplotlib(バージョン3.3.3)を使用し、「結果」をmatplotlibとともに次の方法でファイルに保存します。

ptr_fig.set_canvas(matplotlib.backends.backend_agg.FigureCanvasAgg(ptr_fig)) 
ptr_fig.savefig(temporary_image_file_path, dpi = 100, format = "png")

これはすべて一般的にうまく機能し、完璧です(ここにいくつかの例を示します。フレームワークにさまざまなツリー描画スタイルを実装しました): ツリーコンパクト描画スタイル 同じ木の他の描画スタイル もう一度同じ木をもう一度他の描画スタイル

しかし、巨大な木では、これを持つことができます: クレイジーな画像ストレージ

そして、それは私が現時点で理解していないことです! ここで何が間違っていますか?matplotlibの設定が間違っていると思いますが、何がわかりません

備考: 上の写真は実際には非常に大きく、解像度は 56200 * 5200 です。

MS-Edge で表示される別の全体像 (したがって、html に含まれる画像): MS-Edge で見たクレイジーな画像

次のいくつかの背景情報は、原則でどのように機能するかです (もちろん、実際の詳細ははるかに複雑です ==> 必要なものだけを説明し、物事を単純化しますが、原則として、もちろん私が書いていることはすべてです)真実)

私のツリーフレームワークを使用して、ビジュアルツリーのすべてのノードと接続の座標を計算します

  • たとえば、計算された x 座標の最小値は 0 です (たとえば、ツリーの一番左のノードの左側の場合)
  • たとえば、計算された x 座標の最大値は 100 です (たとえば、ツリーの最も右側のノードの右側の場合)。

計算された最大のx 座標と y 座標を使用して、figsize を計算します (したがって、ツリーが大きい場合は、フィギュアのインチ数を増やします)。

DPI = 100
FACTOR = 10
x_pixels = FACTOR * max_x_tree_coord
y_pixels = FACTOR * max_y_tree_coord
ptr_fig = matplotlib.figure.Figure(figsize = (x_pixels / DPI, y_pixels / DPI),
                                   dpi = DPI)
self.__ptr_axis = ptr_fig.gca()

matplotlib でツリーを描画する前に、ツリー フレームワークが計算した座標を「正規化」して、matplotlib フレームワークが受け取る x 座標と y 座標の値が 0 と 1 の間のみになるようにします (したがって、変数コード ダウンの「左」と「下」は、0 から 1 の間の値のみを持つことができます)

次に、ノードと接続を描画します。次の例では、ノードの「ボックス」を描画する方法を示しています

p = plt.Rectangle((left, bottom),
                  width,
                  height,
                  fill = fill,
                  edgecolor = edgecolor,
                  facecolor = facecolor,
                  linewidth = linewidth)
p.set_transform(self.__ptr_axis.transAxes)
p.set_clip_on(False)
self.__ptr_axis.add_patch(p)

最後に私は

ptr_fig.set_canvas(matplotlib.backends.backend_agg.FigureCanvasAgg(ptr_fig)) 
ptr_fig.savefig(r"C:\path\to\my\tree_image.png", dpi = 100, format = "png")

何がうまくいかないのか誰かが考えてくれたとき、私はとても幸せです:-)

すでに多くの回答に感謝します

よろしくフォンソ

4

0 に答える 0