各データポイントに異なるテキストを含むMatplotlib散布図


252

私は散布図を作成し、リストからの異なる番号でデータポイントに注釈を付けようとしています。したがって、たとえば、yvs をプロットしてx、からの対応する番号で注釈を付けたいと思いnます。

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]
ax = fig.add_subplot(111)
ax1.scatter(z, y, fmt='o')

何か案は?


mpld3ライブラリを使用すると、ホバー時のツールチップラベル付きの散布図を取得することもできます。mpld3.github.io/examples/scatter_tooltip.html
Claude COULOMBE

回答:


466

配列やリストannotate()を取得するプロット方法は知りませんが、の値を繰り返し処理するときに使用できますn

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.subplots()
ax.scatter(z, y)

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

には多くのフォーマットオプションがあります。matplotlibWebサイトをannotate()参照してください

ここに画像の説明を入力してください


1
Seaborn regplotの上で、あまり混乱させることなくうまく機能します。
ijoseph 2016

@Rutger私はパンダのdatframeを使用し、どういうわけかaを取得しますKeyError-したがって、dict()オブジェクトが期待されていると思いますか?enumerateannotateおよびパンダデータフレームを使用してデータにラベルを付ける他の方法はありますか?
レイチェル

@Rachel、を使用してfor row in df.iterrows():、etcで値にアクセスできますrow['text'], row['x-coord']。別の質問を投稿する場合は、確認します。
Rutger Kassies 2017年

@RutgerKassiesありがとう、ラトガー!私はここに質問を投稿しましたstackoverflow.com/questions/41481153/… この質問そのものに似ているのではないかと心配しています。しかし、どういうわけかうまくいかない。ご協力ありがとうございました!
Rachel

1
@aviator、残念ながら組み込みではありません。しかし、たとえばnetworkxのレイアウトエンジンを使用してこれを参照してください:stackoverflow.com/a/34697108/1755432
Rutger Kassies

32

matplotlib 2.0より前のバージョンでax.scatterは、マーカーなしでテキストをプロットする必要はありません。バージョン2.0ではax.scatter、テキストの適切な範囲とマーカーを設定する必要があります。

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.subplots()

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

このリンクでは、3Dの例を見つけることができます。


これはすごい!このソリューションを共有していただきありがとうございます。フィギュアのサイズを設定するための適切なコードを教えてください。などの実装plt.figure(figsize=(20,10))は、このコードを呼び出しても実際には画像のサイズが変更されないという点で、期待どおりに機能していません。あなたの援助を楽しみにしています。ありがとう!
レバイン

イチジク、ax = plt.subplots(figsize =(20,10))
rafaelvalle 2018年

21

上記のソリューションを.subplot()ではなく.scatter()に適用しようとしている場合は、

次のコードを実行してみました

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.scatter(z, y)

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

しかし、「反復不可能なPathCollectionオブジェクトをアンパックできない」というエラーが発生し、具体的にはコードラインイグジクax = plt.scatter(z、y)を指しています。

私は最終的に次のコードを使用してエラーを解決しました

plt.scatter(z, y)

for i, txt in enumerate(n):
    plt.annotate(txt, (z[i], y[i]))

.scatter()と.subplot()の間に違いがあるとは思っていませんでした。


11

使用することもできますpyplot.textこちらを参照)。

def plot_embeddings(M_reduced, word2Ind, words):
""" Plot in a scatterplot the embeddings of the words specified in the list "words".
    Include a label next to each point.
"""
for word in words:
    x, y = M_reduced[word2Ind[word]]
    plt.scatter(x, y, marker='x', color='red')
    plt.text(x+.03, y+.03, word, fontsize=9)
plt.show()

M_reduced_plot_test = np.array([[1, 1], [-1, -1], [1, -1], [-1, 1], [0, 0]])
word2Ind_plot_test = {'test1': 0, 'test2': 1, 'test3': 2, 'test4': 3, 'test5': 4}
words = ['test1', 'test2', 'test3', 'test4', 'test5']
plot_embeddings(M_reduced_plot_test, word2Ind_plot_test, words)

ここに画像の説明を入力してください


7

Python 3.6以降:

coordinates = [('a',1,2), ('b',3,4), ('c',5,6)]
for x in coordinates: plt.annotate(x[0], (x[1], x[2]))

2

リスト内包表記とnumpyを使用する1つのライナーとして:

[ax.annotate(x[0], (x[1], x[2])) for x in np.array([n,z,y]).T]

セットアップはラトガーの答えと同じです。


1

ラベルに注釈を付けるために矢印/テキストボックスを使用することもできます。これが私の意味です:

import random
import matplotlib.pyplot as plt


y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.subplots()
ax.scatter(z, y)

ax.annotate(n[0], (z[0], y[0]), xytext=(z[0]+0.05, y[0]+0.3), 
    arrowprops=dict(facecolor='red', shrink=0.05))

ax.annotate(n[1], (z[1], y[1]), xytext=(z[1]-0.05, y[1]-0.3), 
    arrowprops = dict(  arrowstyle="->",
                        connectionstyle="angle3,angleA=0,angleB=-90"))

ax.annotate(n[2], (z[2], y[2]), xytext=(z[2]-0.05, y[2]-0.3), 
    arrowprops = dict(arrowstyle="wedge,tail_width=0.5", alpha=0.1))

ax.annotate(n[3], (z[3], y[3]), xytext=(z[3]+0.05, y[3]-0.2), 
    arrowprops = dict(arrowstyle="fancy"))

ax.annotate(n[4], (z[4], y[4]), xytext=(z[4]-0.1, y[4]-0.2),
    bbox=dict(boxstyle="round", alpha=0.1), 
    arrowprops = dict(arrowstyle="simple"))

plt.show()

次のグラフが生成されます。 ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.