簡體   English   中英

在不使用循環的情況下分段着色 matplotlib.pyplot 線 plot

[英]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中的xy都是二維的起點和終點列表,例如

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以相同格式匹配時)。

要使用此方法為各個線條着色,您可能需要使用 面向對象的 apiax而不是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.

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