2016-07-03 17 views
1

私は...散布図の注釈のために、このコードのようなものを取るために、このプロット生成注釈を点の上に水平に配置するにはどうすればよいですか?

import matplotlib; matplotlib.use('TkAgg') 
import matplotlib.pyplot as plt 

labels = ["Abra", "Kadabra", "Alazkazam", "Mew"] 
x_values = [0.3, 0.6, 0.2, 0.4] 
y_values = [0.2, 0.2, 0.4, 0.9] 

fig = plt.figure(figsize=(5, 5)) 
plt.axis('off') 

renderer = fig.canvas.get_renderer() 

for i, label in enumerate(labels): 
    plt.scatter(x_values[i], y_values[i]) 
    text_object = plt.annotate(label, xy=(x_values[i], y_values[i])) 

plt.savefig("horizontally_centered_text_annotations.png") 

...たいと思います: annotations without centering

を...そして、それはこのようなものを生成しますプロット: annotations with centering

私は、x座標と幅をつかん、テキストボックスの周りにウィンドウの大きさを取得しようとした、などのように、各注釈のためにオーバーシフトしました:

for i, label in enumerate(labels): 
    plt.scatter(x_values[i], y_values[i]) 
    text_object = plt.annotate(label, xy=(x_values[i], y_values[i])) 
    text_window_extent = text_object.get_window_extent(renderer) 
    new_x_position = x_values[i] - text_window_extent.width/2 
    text_object.set_position((new_x_position, y_values[i])) 
    print "x_value: {}, window_extent_width: {}, new_x_position: {}".format(x_values[i], text_window_extent.width, new_x_position) 

しかし、あなたは幅が大きすぎるprint文から、ここで見ることができますように。

x_value: 0.3, window_extent_width: 31.5, new_x_position: -15.45 
x_value: 0.6, window_extent_width: 56.0, new_x_position: -27.4 
x_value: 0.2, window_extent_width: 72.875, new_x_position: -36.2375 
x_value: 0.4, window_extent_width: 30.75, new_x_position: -14.975 

ない、これは座標系に関係している場合はどのように確認してください...

答えて

3

horizontalalignment(これを使用しますha)をannotateコールに短縮することができます。

text_object = plt.annotate(label, xy=(x_values[i], y_values[i]), ha='center') 
+0

完全に動作します。 – legel

関連する問題