2

3Dグラフがあり、座標で注釈を付けたいと思います。ただし、注釈は重複します。重ならないようにお願いします。

私の問題は-

  • 注釈が重なる
  • 伝説では、なぜ三角形と円の2つのシンボルがあるのか​​わかりません。たった1つではないですか?

参考までに、私のデータセットは以下の点に限定されています。したがって、他のパラメーターがハードコーディングされている場合でも、問題はありません。

これが私のコードです。

from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d import proj3d
import matplotlib.pyplot as plt
import pylab    

xData1=[ 24500.,   2980.,   2980.,  13740.]
xData2=[  8360.,   8360.,  24500.,   5670.,   2980.,   2980.,  11050.,  13740.]
yData1=[ 179.,  244.,  242.,  181.]
yData2=[ 132.,  149.,  116.,  163.,  247.,  228.,  116.,  116.]
zData1=[  1.,  44.,  86.,  44.]
zData2=[ 86.,  22.,   1.,  86.,  43.,  86.,  86.,  22.]

fig = plt.figure()
ax = fig.gca(projection='3d')

ax.plot(xData1, yData1, zData1, '^', c='r', label='cfg1')
ax.plot(xData2, yData2, zData2, 'o', c='b', label='cfg2')


for i in range(len(xData1)):
    text='['+str(int(xData1[i]))+','+str(int(yData1[i]))+','+str(int(zData1[i]))+']'    
    x2, y2, _ = proj3d.proj_transform(xData1[i],yData1[i],zData1[i], ax.get_proj())    
    label = pylab.annotate(text,
    xycoords='data', 
    xy = (x2, y2), xytext = (60, 20),
    textcoords = 'offset points', ha = 'right', va = 'bottom',
    bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
    arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))


for i in range(len(xData2)):
    text='['+str(int(xData2[i]))+','+str(int(yData2[i]))+','+str(int(zData2[i]))+']'    
    x2, y2, _ = proj3d.proj_transform(xData2[i],yData2[i],zData2[i], ax.get_proj())    
    label = pylab.annotate(text,
    xycoords='data', 
    xy = (x2, y2), xytext = (20, 20),
    textcoords = 'offset points', ha = 'right', va = 'bottom',
    bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
    arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))

ax.set_xlabel('X-Data')
ax.set_ylabel('Y-Data')
ax.set_zlabel('Z-Data')

ax.legend(ncol=3)
plt.show()
4

1 に答える 1

1

どちらの質問も比較的簡単に答えられます。最初に 2 番目のものから始めます。凡例を定義したときに数字を指定しなかったため、凡例には 2 つのシンボルがあり、デフォルト値は 2 です。修正するには、次のように変更します。

    ax.legend(ncol=3, numpoints=1)

ここnumpointsで、凡例内のポイント数を変更します - 現在は 1 に設定されています。

最初の質問への回答には、テキスト注釈の配置、より具体的にはxytext、テキストの座標を示す の操作が含まれます。2 番目の for ループを以下に置き換えると、重複するテキストが取り除かれ、他の見苦しい場所の問題のために注釈ボックスの場所を変更する方法の良い例が得られます。

    for i in range(len(xData2)):
    text='['+str(int(xData2[i]))+','+str(int(yData2[i]))+','+str(int(zData2[i]))+']'
    x2, y2, _ = proj3d.proj_transform(xData2[i],yData2[i],zData2[i], ax.get_proj())
    if i==4:
        label = pylab.annotate(text,
                       xycoords='data',
                       xy = (x2, y2), xytext = (0, -50),
                       textcoords = 'offset points', ha = 'right', va = 'bottom',
                       bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
                       arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
    elif i==6:
        label = pylab.annotate(text,
                           xycoords='data',
                           xy = (x2, y2), xytext = (-40, 0),
                           textcoords = 'offset points', ha = 'right', va = 'bottom',
                           bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
                           arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
    else:
        label = pylab.annotate(text,
                           xycoords='data',
                           xy = (x2, y2), xytext = (-20, 10),
                           textcoords = 'offset points', ha = 'right', va = 'bottom',
                           bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
                           arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
于 2012-10-14T08:27:37.560 に答える