[英]matplotlib color lines according to magnitude
我有一些線,線上的每個點都被分配了一定的大小。 我想用與該幅度相對應的顏色繪制線條。 有一種方法可以用 scatter 做類似的事情,但這只會繪制顏色編碼的點。
我更喜歡散點圖來顯示線條,因為它會使放大時看起來更好。增加點數對我來說不是一個選擇,因為在我的現實世界問題中,這在計算上太昂貴了。 點之間的插值可以通過相鄰點之間的簡單插值來完成。
散點圖的小例子
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
z = np.cos(x)
y2 = np.sin(x)+0.4
z2 = 0.5*np.cos(2*x)
x3 = np.hstack((x,x))
y3 = np.hstack((y,y2))
z3=np.hstack((z,z2))
fig = plt.figure()
ax = fig.add_subplot(111)
#ax.scatter(x, y, c=z)
#ax.scatter(x, y2, c=z2)
sc = ax.scatter(x3, y3, c=z3)
cbar = fig.colorbar(sc)
plt.show()
您可以將線條分割成一些小段,然后根據某個值為每個段設置不同的顏色。 出於性能原因,您可以使用LineCollection 。 以下代碼供您參考:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.collections as mcollection
import matplotlib.colors as mcolors
def seg_plot(ax, X, Y, Z, cmap=None, alpha=None, **kargs):
if cmap is None:
cmap = plt.get_cmap()
P = np.array([X, Y]).T.reshape(-1, 1, 2)
S = np.concatenate([P[:-1], P[1:]], axis=1)
norm = mcolors.Normalize(vmin=Z.min(), vmax=Z.max())
C = cmap(norm(Z))
L = mcollection.LineCollection(S, color=C, alpha=alpha, **kargs)
ax.add_collection(L)
ax.set_xlim(X.min(), X.max())
ax.set_ylim(1.1*Y.min(), 1.1*Y.max())
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
z = np.cos(x)
y2 = np.sin(x)+0.4
z2 = 0.5*np.cos(2*x)
fig, ax = plt.subplots()
seg_plot(ax, x, y, z, linewidth=2)
seg_plot(ax, x, y2, z2, linewidth=2)
ax.set_ylim([-2, 2])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.