[英]Colouring a matplotlib.pyplot line plot piecewise without the use of loops
我有一些 python 代碼,它在二維平面中產生有限數量的連續點,我正在使用matpoltlib
嘗試用連接線對這些點進行 plot ,用於說明這些點的返回順序。對於例如,如果我有點(0,0), (0,1), (1,1), (1,-1), (-1,-1), (-1,2),...
(描述方形螺旋),我可以用代碼 plot 這個:
import matplotlib.pyplot as plt
x = [0,1,1,-1,-1,2,2,-2,-2]
y = [0,0,1,1,-1,-1,2,2,-2]
plt.plot(x,y)
plt.show()
這將返回 plot:
為了更好地突出顯示點返回的順序,我希望將漸變配色方案應用於此 plot,每條組成線的顏色不同(同時在該線段上顏色一致)。 這樣就會返回具有這種效果的東西:
我意識到這可以通過一個循環來完成,單獨繪制每條線並根據需要對其進行着色。 但這非常緩慢,並且隨着點數的增加,我的計算機幾乎停止運行。 因此,有沒有一種方法可以以某種優化的方式實現?
您可以通過稍微不同地排列數據來做到這一點,這樣plt.plot
中的x
和y
都是二維的起點和終點列表,例如
import matplotlib.pyplot as plt
x = [-2, -2, 2, 2, -1, -1, 1, 1, 0]
y = [-2, 2, 2, -1, -1, 1, 1, 0, 0]
plt.plot([x[:-1], x[1:]], [y[:-1], y[1:]])
這將為您提供您想要的 plot(盡管您選擇的顏色需要一些額外的樣式)
編輯:
為什么matplotlib
會這樣做? 好吧,在某種程度上這就是pyplot.plt
工作原理。 關鍵位在Plotting multiple sets of data下:“或者,如果您的數據已經是 2d 數組,則可以將其直接傳遞給 x, y。將為每一列繪制一個單獨的數據集。”
通過執行[x[:-1], x[1:]]
我們實質上是將x
變成了一個二維列表:
[[-2, -2, 2, 2, -1, -1, 1, 1],
[-2, 2, 2, -1, -1, 1, 1, 0]]
並且每一列都被視為一個單獨的行(當與y
以相同格式匹配時)。
要使用此方法為各個線條着色,您可能需要使用 面向對象的 api ( ax
而不是plt
),並使用ax.set_prop_cycle
設置顏色 map 的顏色,例如Spectral
顏色 Z1D78DC8ED51249E 你的最終代碼看起來像
fig, ax = plt.subplots()
n = len(x)
colors = plt.cm.Spectral([i / n for i in range(1, n+1)])
ax.set_prop_cycle('color', colors)
ax.plot([x[:-1], x[1:]], [y[:-1], y[1:]])
(或與numpy
)
colors = plt.cm.Spectral(np.linspace(0, 1, len(x)))
第一個版本會給你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.