プロット上のポイントの横にある値でデータ ポイントに注釈を付けたいと思います。私が見つけた例では、x と y のみをベクトルとして扱っています。ただし、複数の列を含む pandas DataFrame に対してこれを行いたいと思います。
ax = plt.figure().add_subplot(1, 1, 1)
df.plot(ax = ax)
plt.show()
複数列の DataFrame のすべてのポイントに注釈を付ける最良の方法は何ですか?
プロット上のポイントの横にある値でデータ ポイントに注釈を付けたいと思います。私が見つけた例では、x と y のみをベクトルとして扱っています。ただし、複数の列を含む pandas DataFrame に対してこれを行いたいと思います。
ax = plt.figure().add_subplot(1, 1, 1)
df.plot(ax = ax)
plt.show()
複数列の DataFrame のすべてのポイントに注釈を付ける最良の方法は何ですか?
他の列の 1 つを注釈のテキストとして使用しますか? これは私が最近したことです。
いくつかのサンプルデータから始めます
In [1]: df
Out[1]:
x y val
0 -1.015235 0.840049 a
1 -0.427016 0.880745 b
2 0.744470 -0.401485 c
3 1.334952 -0.708141 d
4 0.127634 -1.335107 e
ポイントをプロットします。この例では、y を x に対してプロットします。
ax = df.set_index('x')['y'].plot(style='o')
ポイントの横に注釈を付けるために、x、y、および値をループする関数を作成します。
def label_point(x, y, val, ax):
a = pd.concat({'x': x, 'y': y, 'val': val}, axis=1)
for i, point in a.iterrows():
ax.text(point['x'], point['y'], str(point['val']))
label_point(df.x, df.y, df.val, ax)
draw()
複数のdf
列があり、そのうちの 3 つがx
、y
、および であるとしlbl
ます。(x,y)
で散布図に注釈を付けるには、次のようにしlbl
ます。
ax = df.plot(kind='scatter',x='x',y='y')
df[['x','y','lbl']].apply(lambda row: ax.text(*row),axis=1);
以前の回答、特にレイアウトを少し改善したLondonRob の例は非常に役に立ちました。
私を悩ませた唯一のことは、データフレームからデータを引き出してループするのが好きではないということです。DataFrame の無駄のようです。
.apply() を使用してループを回避し、見栄えの良い注釈を含める代替方法を次に示します (カラー スケールが少しやり過ぎで、カラーバーを消すことができなかったと思いました)。
ax = df.plot('x', 'y', kind='scatter', s=50 )
def annotate_df(row):
ax.annotate(row.name, row.values,
xytext=(10,-5),
textcoords='offset points',
size=18,
color='darkslategrey')
_ = df.apply(annotate_df, axis=1)
最近コード例を編集しました。もともとは同じものを使用していました:
fig, ax = plt.subplots()
軸を公開する他の投稿と同様ですが、これは不要であり、次のようになります。
import matplotlib.pyplot as plt
ラインも不要。
また、次の点に注意してください。
xytext
より良い配置を得るために値をいじる必要がある場合があります。