47

プロット上のポイントの横にある値でデータ ポイントに注釈を付けたいと思います。私が見つけた例では、x と y のみをベクトルとして扱っています。ただし、複数の列を含む pandas DataFrame に対してこれを行いたいと思います。

ax = plt.figure().add_subplot(1, 1, 1)
df.plot(ax = ax)
plt.show()

複数列の DataFrame のすべてのポイントに注釈を付ける最良の方法は何ですか?

4

4 に答える 4

40

他の列の 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()

注釈付きポイント

于 2013-04-09T19:59:43.870 に答える
31

複数のdf列があり、そのうちの 3 つがxy、および であるとし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);
于 2016-09-07T16:05:20.790 に答える
12

以前の回答、特にレイアウトを少し改善した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

ラインも不要。

また、次の点に注意してください。

  • この例を再現しようとしていて、プロットのポイントが私たちのものと同じ場所にない場合は、DataFrame がランダムな値を使用していたことが原因である可能性があります。固定データ テーブルまたはランダム シードを使用していれば、おそらく混乱は少ないでしょう。
  • ポイントによっては、xytextより良い配置を得るために値をいじる必要がある場合があります。
于 2015-01-04T00:30:52.270 に答える