Python 中的散点图和颜色映射

我有一个存储在数字数组中的 x 和 y 点的范围。 Those represent x(t) and y(t) where t=0...T-1

我正在绘制一个散点图

import matplotlib.pyplot as plt


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

我希望有一个表示时间的颜色图(因此根据数字数组中的索引对点着色)

最简单的方法是什么?

294374 次浏览

Here is an example

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

Here you are setting the color based on the index, t, which is just an array of [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

Note that the array you pass as c doesn't need to have any particular order or type, i.e. it doesn't need to be sorted or integers as in these examples. The plotting routine will scale the colormap such that the minimum/maximum values in c correspond to the bottom/top of the colormap.

彩色地图

您可以通过添加

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绿色地图的例子:

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)) ,添加一个颜色条可能会更复杂一些。好的例子可以找到 在这里为一个单一的子情节色彩条这里有2个子图1个色彩条

要添加到 wflynny 的答案以上,您可以找到可用的颜色地图 here

例如:

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

Scatter subplots with COLORBAR

请注意,您还将输出一个可以忽略的次要数字。

用于多个子情节的单色条

有时,最好有一个单一的颜色表示数据值可视化在多个子图。

在这种情况下,需要使用两个图中的最小和最大数据值创建 Normalize ()对象。

然后,可以从 ScalarMapable ()对象创建一个彩色条对象,该对象在标量值和颜色之间映射。

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

子图 _ 彩色条