web-dev-qa-db-ja.com

matplotlibに線のスタイルのリストはありますか?

プロットを行うスクリプトを書いています。それぞれが独自のラインスタイル(色ではない)を持つ複数のデータシリーズをプロットするようにします。リストを簡単に反復処理できますが、Pythonで既に使用可能なリストはありますか?

64
Yotam

ドキュメント によると、これを行うことでそれらを見つけることができます:

from matplotlib import lines
lines.lineStyles.keys()
>>> ['', ' ', 'None', '--', '-.', '-', ':']

markers でも同じことができます

編集: 最新バージョン には、同じスタイルがまだありますが、ドット/ライン間のスペースを変えることができます。

82
Cédric Julien

plot documentation

http://matplotlib.org/1.5.3/api/pyplot_api.html#matplotlib.pyplot.plot には、ライン+マーカースタイルのリストがあります。

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

これはpyplot.plot docstringの一部であるため、以下を使用して端末から表示することもできます。

import matplotlib.pyplot as plt
help(plt.plot)

私の経験から、色とマーカーをリストに入れておくといいので、プロットするときにそれらを繰り返すことができます。

そのようなもののリストを取得する方法は次のとおりです。掘り出しました。

import matplotlib
colors_array = matplotlib.colors.cnames.keys()
markers_array = matplotlib.markers.MarkerStyle.markers.keys()
7
Russell Lego

Python3では、.keys()メソッドはlistではなく_dict_keys_オブジェクトを返します。 python2でできるように配列にインデックスを付けることができるように、結果をlist()に渡す必要があります。例えば this SO question

したがって、線、色、マーカーの反復可能な配列を作成するには、次のようなものを使用できます。

_import matplotlib
colors_array = list(matplotlib.colors.cnames.keys())
lines_array = list(matplotlib.lines.lineStyles.keys())
markers_array = list(matplotlib.markers.MarkerStyle.markers.keys())
_
3
Jason Neal

リストにアクセスするという質問には直接答えていませんが、このページにもう1つの選択肢があると便利です。破線スタイルを生成する追加の方法があります。

次のような横縞でAとBの間に線を生成できます

A ||||||||||||||||||||||||||||||||||||||||||||| B

A || || || || || || || || || || || || || || || || B

A | | | | | | | | | | | | | | | | | | | | | | | | B

線の幅を広げてandカスタムダッシュパターンを指定します。

ax.plot(x, y, dashes=[30, 5, 10, 5])

_matplotlib.lines.Line2D_のドキュメント これは言うset_dashes(seq)について:

ダッシュシーケンス、オンオフインクをポイントとするダッシュのシーケンスを設定します。 seqが空の場合、またはseq =(None、None)の場合、線種は実線に設定されます。

ACCEPTS:点のオン/オフインクのシーケンス

線を描くと、数字のシーケンスが線に沿ってペイントされるポイントの数を指定し、次に、残っているポイントの数(2つの数字がある場合)、ペイントされる数、ペイントされていないものの数(シーケンスに4つの数字がある場合)。 4つの数値を使用して、一点鎖線を生成できます。[30、5、3、5]は、30ポイントの長さのダッシュ、5ポイントのギャップ、3ポイントのダッシュ(ドット)、および5 -ポイントギャップ。その後、繰り返します。

ドキュメントのこのページ この可能性について説明しています。 こちらをご覧ください それを行う2つの異なる方法について。

1

辞書は Linestyleの例 からコピーできます:

from collections import OrderedDict

linestyles = OrderedDict(
    [('solid',               (0, ())),
     ('loosely dotted',      (0, (1, 10))),
     ('dotted',              (0, (1, 5))),
     ('densely dotted',      (0, (1, 1))),

     ('loosely dashed',      (0, (5, 10))),
     ('dashed',              (0, (5, 5))),
     ('densely dashed',      (0, (5, 1))),

     ('loosely dashdotted',  (0, (3, 10, 1, 10))),
     ('dashdotted',          (0, (3, 5, 1, 5))),
     ('densely dashdotted',  (0, (3, 1, 1, 1))),

     ('loosely dashdotdotted', (0, (3, 10, 1, 10, 1, 10))),
     ('dashdotdotted',         (0, (3, 5, 1, 5, 1, 5))),
     ('densely dashdotdotted', (0, (3, 1, 1, 1, 1, 1)))])

その後、ラインスタイルを反復処理できます

fig, ax = plt.subplots()

X, Y = np.linspace(0, 100, 10), np.zeros(10)
for i, (name, linestyle) in enumerate(linestyles.items()):
    ax.plot(X, Y+i, linestyle=linestyle, linewidth=1.5, color='black')

ax.set_ylim(-0.5, len(linestyles)-0.5)

plt.show()

または、それらから単一の線種を取ります。

ax.plot([0,100], [0,1], linestyle=linestyles['loosely dashdotdotted'])