我有一些存储在numpy数组中的点x和y。
它们表示x(t)和y(t),其中t=0...T-1
我正在使用scatter plot绘制散点图:
import matplotlib.pyplot as plt
plt.scatter(x,y)
plt.show()
我希望有一个代表时间的色图(因此根据numpy数组中的索引对点进行着色)
最简单的方法是什么?
我有一些存储在numpy数组中的点x和y。
它们表示x(t)和y(t),其中t=0...T-1
我正在使用scatter plot绘制散点图:
import matplotlib.pyplot as plt
plt.scatter(x,y)
plt.show()
我希望有一个代表时间的色图(因此根据numpy数组中的索引对点进行着色)
最简单的方法是什么?
这是一个例子
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(100)
y = np.random.rand(100)
t = np.arange(100)
plt.scatter(x, y, c=t)
plt.show()
[1, 2, ..., 100]
。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(100)
y = x
t = x
plt.scatter(x, y, c=t)
plt.show()
c
中的最小/最大值对应于颜色映射的底部/顶部。
您可以通过添加来更改颜色映射
import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.cmap_name)
导入matplotlib.cm
是可选的,因为您可以像这样调用颜色映射:cmap="cmap_name"
。有一个参考页面显示了每个颜色映射的外观。还要知道,您可以通过简单地将其称为cmap_name_r
来反转颜色映射。所以,两者都可以。
plt.scatter(x, y, c=t, cmap=cm.cmap_name_r)
# or
plt.scatter(x, y, c=t, cmap="cmap_name_r")
将会起作用。例如"jet_r"
或cm.plasma_r
。这里有一个使用新的1.5色图viridis的例子:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(100)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')
plt.show()
您可以使用以下方法添加颜色条
plt.scatter(x, y, c=t, cmap='viridis')
plt.colorbar()
plt.show()
请注意,如果您明确使用图形和子图(例如fig,ax = plt.subplots()
或ax = fig.add_subplot(111)
),添加色条可能会更加复杂。可以在此处找到单个子图色条的良好示例here for a single subplot colorbar,以及在此处找到2个子图1个色条的示例here for 2 subplots 1 colorbar。import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.jet)
plt.scatter(x, y, c=t, cmap='jet')
子图颜色条
对于带有散点图的子图,可以通过利用辅助图形构建“可映射对象”来将颜色条添加到您的轴上。
以下是上面示例的延续:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')
# Build your secondary mirror axes:
fig2, (ax3, ax4) = plt.subplots(1, 2)
# Build maps that parallel the color-coded data
# NOTE 1: imshow requires a 2-D array as input
# NOTE 2: You must use the same cmap tag as above for it match
map1 = ax3.imshow(np.stack([t, t]),cmap='viridis')
map2 = ax4.imshow(np.stack([t, t]),cmap='viridis_r')
# Add your maps onto your original figure/axes
fig.colorbar(map1, ax=ax1)
fig.colorbar(map2, ax=ax2)
plt.show()
请注意,您还将输出一个次要的图形,您可以忽略它。map1 = ax1.scatter(x,y,c=t,cmap='viridis')
,那么这将更容易实现,而无需进行其他步骤,只需使用fig.colorbar(map1, ax=ax1)
即可。 - Olivér Palotás有时候,当多个子图中展示一段数据时,希望使用一个色条来表示数据值,这种情况下需要使用Normalize()对象来创建色条,该对象会基于两个子图间的最小和最大数据值进行归一化。
接着可以使用ScalarMappable()对象创建颜色条,该对象会将标量值映射到相应颜色。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10)
y = x
t1 = x # Colour data for first plot
t2 = 2*x # Color data for second plot
all_data = np.concatenate([t1, t2])
# Create custom Normalise object using the man and max data values across both subplots to ensure colors are consistent on both plots
norm = plt.Normalize(np.min(all_data), np.max(all_data))
fig, axs = plt.subplots(1, 2)
axs[0].scatter(x, y, c=t1, cmap='viridis', norm=norm)
axs[1].scatter(x**2, y, c=t2, cmap='viridis', norm=norm)
# Create the colorbar
smap = plt.cm.ScalarMappable(cmap='viridis', norm=norm)
cbar = fig.colorbar(smap, ax=axs, fraction=0.1, shrink = 0.8)
cbar.ax.tick_params(labelsize=11)
cbar.ax.set_ylabel('T', rotation=0, labelpad = 15, fontdict = {"size":14})
plt.show()
plt.colorbar()
命令获取颜色图例。 - drevickocm.colormap_name
和cm.cmapname
在matplotlib.cm
中并不是实际的变量;它只是代表cm.jet
或cm.veridis_r
等伪代码。 - wflynnyplt.legend("wflynny")
- user12582392edgecolors
遵循cmap的指导? - Ciprian Tomoiagă