matplotlib中是否有线型列表?


76

我正在编写一个脚本,将进行一些绘图。我希望它绘制几个数据系列,每个数据系列都有其独特的线条样式(不是颜色)。我可以轻松地遍历列表,但是python中已经有这样的列表了吗?


2
我知道这是不是真的,你怎么寻找,但我有他们的名单在我的答案在这里
维姆

Answers:


93

根据文档,您可以通过执行以下操作找到它们:

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

您可以使用标记做同样的事情

编辑:在最新版本中,仍然有相同的样式,但是您可以改变点/线之间的间隔。


5
标记的语法似乎略有不同:from matplotlib import markers; markers.MarkerStyle.markers.keys()
joelostblom

在2.1.2版中,lines.lineMarkers.keys()产生与相同的结果markers.MarkerStyle.markers.keys()
Matt Hancock

1
可惜只有4种选择,但我要画5条线。
GoingMyWay

38

plot 文件资料

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文档字符串的一部分,因此您还可以从终端使用以下命令查看它:

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

1
由于线型在的文档中列出pyplot.plot(),因此可以通过阅读该函数的docstring在本地进行查看:import matplotlib.pyplot as plt; ?plt.plot。标记和线条样式在末尾的“注释”部分中列出。
joelostblom

8

根据我的经验,在列表中包含颜色和标记是很好的,这样我在绘制时就可以遍历它们。

这是我获取此类物品清单的方式。花了一些时间。

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

4

您可以从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'])

3

在python3中,该.keys()方法返回一个dict_keys对象,而不是list。您需要传递结果以list()能够像在python2中一样对数组建立索引。例如这个问题

因此,要创建线条,颜色和标记的可迭代数组,可以使用类似方法。

import matplotlib
colors_array = list(matplotlib.colors.cnames.keys())
lines_array = list(matplotlib.lines.lineStyles.keys())
markers_array = list(matplotlib.markers.MarkerStyle.markers.keys())

1

我没有直接回答访问列表的问题,但是在此页面上还有另一种选择很有用:还有另一种生成虚线样式的方法。

您可以在A和B之间生成带有横向条纹的线条,例如

A ||||||||||||||||||||||||||||||||||||||||||||||| 乙

A || || || || || || || || || || || || || || || || 乙

A | | | | | | | | | | | | | | | | | | | | | | | | 乙

通过增加线宽指定自定义破折号模式:

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

的文档说明了matplotlib.lines.Line2D 以下内容set_dashes(seq)

设置破折号顺序,以点为单位的墨迹的破折号顺序。如果seq为空或seq =(None,None),则线型将设置为solid。

ACCEPTS:开/关墨水的顺序(点)

我认为应该说得更好:在绘制直线时,数字序列指定沿直线绘制了多少个点,然后遗漏了多少个点(如果有两个数字),绘制了多少个,有多少未上漆(如果序列中有四个数字)。使用四个数字,您可以生成点划线:[30、5、3、5]给出30点长的虚线,5点间隙,3点虚线(点)和5点差距。然后重复。

文档的本页说明了这种可能性。在这里寻找两种不同的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.