簡體   English   中英

matplotlib 中每個圖的唯一圖標記

[英]unique plot marker for each plot in matplotlib

我有一個循環,我在其中創建了一些圖,並且每個圖都需要唯一的標記。 我考慮創建函數,它返回隨機符號,並以這種方式在我的程序中使用它:

for i in xrange(len(y)):
    plt.plot(x, y [i], randomMarker())

但我認為這種方式不好。 我需要這個只是為了區分圖例上的圖,因為圖必須不與線連接,它們必須只是點集。

itertools.cycle將無限地迭代列表或元組。 這比為您隨機選擇標記的功能更可取。

蟒蛇 2.x

import itertools
marker = itertools.cycle((',', '+', '.', 'o', '*')) 
for n in y:
    plt.plot(x,n, marker = marker.next(), linestyle='')

蟒蛇 3.x

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM