107

我有一系列点 x 和 y 存储在 numpy 数组中。这些代表 x(t) 和 y(t),其中 t=0...T-1

我正在绘制一个散点图

import matplotlib.pyplot as plt

plt.scatter(x,y)
plt.show()

我想要一个表示时间的颜色图(因此根据numpy数组中的索引对点进行着色)

最简单的方法是什么?

4

4 回答 4

197

这是一个例子

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]. 在此处输入图像描述

也许一个更容易理解的例子是稍微简单一点

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不需要具有任何特定的顺序或类型,即不需要像这些示例中那样排序或整数。绘图例程将缩放颜色图,以使最小/最大值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)),则添加颜色条可能会更复杂一些。可以在此处找到单个子图颜色条的好示例,在此处可以找到2 个子图 1 颜色条的示例。

于 2013-07-16T16:45:31.200 回答
10

要添加到上面 wflynny 的答案,您可以在此处找到可用的颜色图

例子:

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.jet)

或者,

plt.scatter(x, y, c=t, cmap='jet')
于 2015-10-30T01:33:56.177 回答
5

子图颜色条

对于具有散点图的子图,您可以通过在辅助图形的帮助下构建“可映射”然后将其添加到原始图来将颜色条欺骗到您的轴上。

作为上述示例的延续:

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

使用 COLORBAR 散点图

请注意,您还将输出一个可以忽略的辅助图形。

于 2019-12-18T21:22:12.833 回答
0

多个子图的单个颜色条

有时最好使用单个颜色条来指示在多个子图上可视化的数据值。

在这种情况下,需要使用两个图中的最小和最大数据值来创建 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

于 2021-09-23T08:43:00.120 回答