80

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

4

6 回答 6

102

根据文档,您可以通过以下方式找到它们:

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

你可以用标记做同样的事情

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

于 2012-11-13T11:33:39.560 回答
44

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)
于 2016-09-15T07:40:02.607 回答
8

根据我的经验,将颜色和标记放在列表中很好,这样我可以在绘图时遍历它们。

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

import matplotlib
colors_array = matplotlib.colors.cnames.keys()
markers_array = matplotlib.markers.MarkerStyle.markers.keys()
于 2017-02-03T21:05:00.803 回答
6

您可以从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'])
于 2019-02-21T10:06:08.633 回答
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())
于 2018-01-12T11:43:30.530 回答
1

我没有直接回答访问列表的问题,但在此页面上再提供一个替代方案很有用:还有另一种方法可以生成虚线样式。

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

一个 ||||||||||||||||||||||||||||||||||||||||||||| 乙

一个 || || || || || || || || || || || || || || || || 乙

一个 | | | | | | | | | | | | | | | | | | | | | | | | 乙

通过增加线条的宽度指定自定义虚线图案:

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

的文档说明了matplotlib.lines.Line2D 一点set_dashes(seq)

设置破折号序列,破折号序列,以点数为单位。如果 seq 为空或 seq = (None, None),则线型将设置为实心。

ACCEPTS:开/关墨水的顺序,以点为单位

我认为可以说得更好:当它画线时,数字序列指定沿线画了多少点,然后省略了多少点(如果有两个数字),画了多少,有多少未绘制(如果序列中有四个数字)。使用四个数字,您可以生成一条点划线:[30, 5, 3, 5] 给出一个 30 点长的破折号、一个 5 点的间隔、一个 3 点的破折号(一个点)和一个 5点差距。然后它重复。

文档的这一页解释了这种可能性。在这里寻找两种不同的方法。

于 2018-08-20T12:54:38.923 回答