matplotlib有哪些线条样式列表?

84

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


2
我知道这不是你真正要搜索的内容,但我在我的答案这里中有一个列表。 - wim
6个回答

105
根据文档,你可以通过以下方式找到它们:
from matplotlib import lines
lines.lineStyles.keys()
>>> ['', ' ', 'None', '--', '-.', '-', ':']
你可以使用标记做同样的事情。
编辑:在最新版本中,仍然有相同的样式,但是你可以改变点和线之间的距离。

7
标记物的语法似乎略有不同:from matplotlib import markers; markers.MarkerStyle.markers.keys() - joelostblom
在2.1.2版本中,lines.lineMarkers.keys()产生的结果与markers.MarkerStyle.markers.keys()相同。 - Matt Hancock
2
真遗憾,只有4个选项,但我有5条线要绘制。 - GoingMyWay

48

plot文档

https://matplotlib.org/3.5.3/api/markers_api.html (之前是 https://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() 的文档中有列出,因此可以通过阅读该函数的文档字符串 import matplotlib.pyplot as plt; ?plt.plot 在本地查看。标记和线条样式在末尾的“注释”部分中列出。 - joelostblom
还有linestyle=(0, (5, 10))用于自定义虚线。 - mins

8

根据我的经验,将颜色和标记放在列表中很好,这样我就可以在绘图时对它们进行迭代。

以下是如何获取此类内容列表的方法。需要一些挖掘。

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

6

您可以从线条样式示例中复制字典:

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'])

linestyle=(0, (5, 10)) will work, but not ls=(0, (5, 10)) - mins

3
在Python3中,.keys()方法返回的是一个dict_keys对象而不是一个list。 如果想要像在Python2中一样索引数组,则需要将结果传递给list()。例如:这个SO问题 因此,要创建可迭代的行、颜色和标记数组,您可以使用以下代码:
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 ||||||||||||||||||||||||||||||||||||||||||||||| B

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

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

通过增加线条宽度并指定自定义虚线模式:

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

matplotlib.lines.Line2D的文档(链接)中关于set_dashes(seq)的说明:

设置虚线序列,即以点为单位的虚线上下墨水的序列。如果seq为空或seq =(None,None),则线条样式将设置为实线。
接受:以点为单位的上/下墨水序列。
我认为可以更好地说明:在绘制线条时,数字序列指定沿着线条绘制多少个点,然后留下多少个点(如果有两个数字),绘制多少个点,不绘制多少个点(如果序列中有四个数字)。使用四个数字,您可以生成虚线‒点线:[30,5,3,5]表示30个点长的虚线,5个点的间隙,3个点的虚线(一个点),5个点的间隙。然后重复。 文档页面解释了这种可能性。看这里有两种不同的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接