我有一个循环,在其中创建了一些图,并且每个图都需要唯一的标记。我考虑创建返回随机符号的函数,并以这种方式在我的程序中使用它:
for i in xrange(len(y)):
plt.plot(x, y [i], randomMarker())
但我认为这种方式并不好。我需要这个只是为了区分图例上的图,因为图不能与线连接,它们必须只是点集。
我有一个循环,在其中创建了一些图,并且每个图都需要唯一的标记。我考虑创建返回随机符号的函数,并以这种方式在我的程序中使用它:
for i in xrange(len(y)):
plt.plot(x, y [i], randomMarker())
但我认为这种方式并不好。我需要这个只是为了区分图例上的图,因为图不能与线连接,它们必须只是点集。
itertools.cycle
将无限期地遍历列表或元组。这比为您随机选择标记的功能更可取。
import itertools
marker = itertools.cycle((',', '+', '.', 'o', '*'))
for n in y:
plt.plot(x,n, marker = marker.next(), linestyle='')
import itertools
marker = itertools.cycle((',', '+', '.', 'o', '*'))
for n in y:
plt.plot(x,n, marker = next(marker), linestyle='')
您可以使用它来生成这样的图(Python 2.x):
import numpy as np
import matplotlib.pyplot as plt
import itertools
x = np.linspace(0,2,10)
y = np.sin(x)
marker = itertools.cycle((',', '+', '.', 'o', '*'))
fig = plt.figure()
ax = fig.add_subplot(111)
for q,p in zip(x,y):
ax.plot(q,p, linestyle = '', marker=marker.next())
plt.show()
似乎还没有人提到用于循环属性的内置 pyplot 方法。所以这里是:
import numpy as np
import matplotlib.pyplot as plt
from cycler import cycler
x = np.linspace(0,3,20)
y = np.sin(x)
fig = plt.figure()
plt.gca().set_prop_cycle(marker=['o', '+', 'x', '*', '.', 'X']) # gca()=current axis
for q,p in zip(x,y):
plt.plot(q,p, linestyle = '')
plt.show()
但是,这种方式会丢失颜色循环。您可以通过将颜色cycler
和标记cycler
对象相乘或相加来添加背景颜色,如下所示:
fig = plt.figure()
markercycle = cycler(marker=['o', '+', 'x', '*', '.', 'X'])
colorcycle = cycler(color=['blue', 'orange', 'green', 'magenta'])
# Or use the default color cycle:
# colorcycle = cycler(color=plt.rcParams['axes.prop_cycle'].by_key()['color'])
plt.gca().set_prop_cycle(colorcycle * markercycle) # gca()=current axis
for q,p in zip(x,y):
plt.plot(q,p, linestyle = '')
plt.show()
添加循环时,它们需要具有相同的长度,因此markercycle
在这种情况下我们只使用前四个元素:
plt.gca().set_prop_cycle(colorcycle + markercycle[:4]) # gca()=current axis
您还可以通过元组使用标记生成,例如
import matplotlib.pyplot as plt
markers = [(i,j,0) for i in range(2,10) for j in range(1, 3)]
[plt.plot(i, 0, marker = markers[i], ms=10) for i in range(16)]
有关详细信息,请参阅Matplotlib 标记文档站点。
另外,这个可以结合上面提到的itertools.cycle循环
只需手动创建一个包含标记字符的数组并使用它,例如:
markers=[',', '+', '-', '.', 'o', '*']
import matplotlib.pyplot as plt
fig = plt.figure()
markers=['^', 's', 'p', 'h', '8']
for i in range(5):
plt.plot(x[i], y[i], c='green', marker=markers[i])
plt.xlabel('X Label')
plt.ylabel('Y Label')
plt.show()