Python中的散点图和颜色映射

130

我有一些存储在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数组中的索引对点进行着色)

最简单的方法是什么?

4个回答

232

这是一个例子

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

在这里,您正在根据索引t设置颜色,该索引只是一个数组[1, 2, ..., 100]enter image description here 也许一个更容易理解的例子是稍微简单一些的。
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()

enter image description here

注意,您传递给 c 的数组不需要具有任何特定的顺序或类型,即它不需要像这些示例中那样排序或整数。绘图例程将缩放颜色映射,使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()

enter image description here

颜色条

您可以使用以下方法添加颜色条

plt.scatter(x, y, c=t, cmap='viridis')
plt.colorbar()
plt.show()

enter image description here

请注意,如果您明确使用图形和子图(例如fig,ax = plt.subplots()ax = fig.add_subplot(111)),添加色条可能会更加复杂。可以在此处找到单个子图色条的良好示例here for a single subplot colorbar,以及在此处找到2个子图1个色条的示例here for 2 subplots 1 colorbar

2
您可以使用 plt.colorbar() 命令获取颜色图例。 - drevicko
代码似乎在这里发生了变化。cmap=cm.colormap_name现在应该是cmap=cm.cmapname。 - Chris
@cmarti1138 我不确定你的意思,cm.colormap_namecm.cmapnamematplotlib.cm中并不是实际的变量;它只是代表cm.jetcm.veridis_r等伪代码。 - wflynny
1
plt.legend("wflynny") - user12582392
有没有关于如何使点为空,只有edgecolors遵循cmap的指导? - Ciprian Tomoiagă
显示剩余2条评论

15
为了补充wflynny的答案,你可以在这里找到可用的颜色映射。
示例:
import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.jet)

或者,作为替代方案,
plt.scatter(x, y, c=t, cmap='jet')

7

子图颜色条

对于带有散点图的子图,可以通过利用辅助图形构建“可映射对象”来将颜色条添加到您的轴上。

以下是上面示例的延续:

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

Scatter subplots with COLORBAR

请注意,您还将输出一个次要的图形,您可以忽略它。

1
如果您将散点图返回值作为地图map1 = ax1.scatter(x,y,c=t,cmap='viridis'),那么这将更容易实现,而无需进行其他步骤,只需使用fig.colorbar(map1, ax=ax1)即可。 - Olivér Palotás

3

多个子图共用一栏色条

有时候,当多个子图中展示一段数据时,希望使用一个色条来表示数据值,这种情况下需要使用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()

subplots_colorbar


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接