Matplotlibでライン上の個々のポイントにマーカーを設定する


174

Matplotlibを使用して図に線をプロットしました。次に、ライン上の個々のポイントにスタイル、特にマーカーを設定します。どうすればよいですか?

私の質問を明確にするために、私はその行のすべてのマーカーではなく、行の個々のマーカーのスタイルを設定できるようにしたいと思います。


2
弧長マーカーの間隔のための関連ソリューション:stackoverflow.com/questions/17406758/...
イオアニスFilippidis

回答:


323

キーワードargs linestyleを指定するかmarker、への呼び出しで使用しplotます。

たとえば、破線と青い円のマーカーを使用します。

plt.plot(range(10), linestyle='--', marker='o', color='b')

同じことのショートカット呼び出し:

plt.plot(range(10), '--bo')

例1

以下は、可能な線とマーカーのスタイルのリストです。

================    ===============================
character           description
================    ===============================
   -                solid line style
   --               dashed line style
   -.               dash-dot line style
   :                dotted line style
   .                point marker
   ,                pixel marker
   o                circle marker
   v                triangle_down marker
   ^                triangle_up marker
   <                triangle_left marker
   >                triangle_right marker
   1                tri_down marker
   2                tri_up marker
   3                tri_left marker
   4                tri_right marker
   s                square marker
   p                pentagon marker
   *                star marker
   h                hexagon1 marker
   H                hexagon2 marker
   +                plus marker
   x                x marker
   D                diamond marker
   d                thin_diamond marker
   |                vline marker
   _                hline marker
================    ===============================

編集: コメントで要求されているように、ポイントの任意のサブセットをマークする例を使用して:

import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(-np.pi, np.pi, 30)
ys = np.sin(xs)
markers_on = [12, 17, 18, 19]
plt.plot(xs, ys, '-gD', markevery=markers_on)
plt.show()

例2

markeverykwarg を使用したこの最後の例は、この機能ブランチのマージにより、1.4以降で可能です。古いバージョンのmatplotlibを使用している場合でも、折れ線グラフに散布図を重ねることで結果を得ることができます。詳細については、編集履歴を参照してください。


2
私はその部分を知っています。私がやりたいことは、特定のポイントだけをマークすることです。あなたの例を考えると、たとえば、2番目と3番目のポイントのみにマーカーをどのように配置しますか?この点に関して私の質問が十分に明確でなかった場合は申し訳ありません。
dbmikus

4
スタイル '-'を指定してplotを1回呼び出し、次にスタイルの 'o'を使用して点のサブセットでplotを再度呼び出すことができます。
WIM

プロットに指定した値を繰り返し処理して、マーカー付きの切断されたドットサブプロットを作成しますか?そして、それらは前の行の上に配置されますか?またはそれを行うためのよりクリーンな方法はありますか?私はその方法でそれを元気にしていますが、私はそれを最も受け入れられる方法でコーディングしたいと思います。
dbmikus 2011

1
いいえ、ループを使用しないでください。キャンバス上でアーティストが多すぎて、非常に遅くなる可能性があります。元の入力のスライスを使用します。
ウィム

@AbidRahmanKを使用してmatplotlib.markers.MarkerStyle.markers、利用可能なすべてのマーカーを表示することもできます。これにより、上記のwimと同様の辞書が返されます。
joelostblom

53

すべてのマーカーの名前と説明を示す画像があります。

import matplotlib.pylab as plt
markers=['.',',','o','v','^','<','>','1','2','3','4','8','s','p','P','*','h','H','+','x','X','D','d','|','_']
descriptions=['point', 'pixel', 'circle', 'triangle_down', 'triangle_up','triangle_left', 'triangle_right', 'tri_down', 'tri_up', 'tri_left','tri_right', 'octagon', 'square', 'pentagon', 'plus (filled)','star', 'hexagon1', 'hexagon2', 'plus', 'x', 'x (filled)','diamond', 'thin_diamond', 'vline', 'hline']
x=[]
y=[]
for i in range(5):
    for j in range(5):
        x.append(i)
        y.append(j)
plt.figure()
for i,j,m,l in zip(x,y,markers,descriptions):
    plt.scatter(i,j,marker=m)
    plt.text(i-0.15,j+0.15,s=m+' : '+l)
plt.axis([-0.1,4.8,-0.1,4.5])
plt.tight_layout()
plt.axis('off')
plt.show()  

例1


14

今後の参考のために- Line2Dによって返されるアーティストにplot()は、set_markevery()特定のポイントにのみマーカーを設定できるメソッドもあります。https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2Dを参照してください。 set_markevery


2
停止:私は考えてサブセットのステップの並べ替え... -任意の点での真のではなく、それが起動する必要があります
WIM

私の印象は、上記の投稿の両方が質問に答えるということです。その理由は、2つの異なる問題に対処するためです。「マーカー」という用語は通常、曲線のスタイルを指します。したがって、通常のルール(たとえば、10ごと)が暗示されます。ポイントの「任意の」サブセットを選択する場合は、元の曲線上のマーカーとしてではなく、別の曲線としてそれを検討してください。それはたまたまマーカーがある別のカーブです。したがって、手動でポイントを選択する必要があると予想されます。この主題は興味深いものであり、さらに深くなっており、関連するコードをリリースした後、今後の投稿でさらにコメントする予定です。
Ioannis Filippidis 2013年

1
@wimうまくいけばそれを1.4にして、任意のポイントをマークできるPRがありますgithub.com/matplotlib/matplotlib/pull/2662
tacaswell

1

特定のポイントマーカーの形状、サイズを変更する簡単な方法は、最初に他のすべてのデータと共にプロットし、次にそのポイント(または複数のポイントのスタイルを変更する場合はポイントのセット)のみでもう1つプロットすることです。 。2番目のポイントのマーカー形状を変更するとします。

x = [1,2,3,4,5]
y = [2,1,3,6,7]

plt.plot(x, y, "-o")
x0 = [2]
y0 = [1]
plt.plot(x0, y0, "s")

plt.show()

結果は次のとおりです。 複数のマーカーを使用したプロット

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