Matplotlib:同一图中两个散点图的通用颜色图

时间:2019-06-24 09:49:54

标签: python matplotlib plot colors

我在2D Numpy arrays中存储了双变量时间序列。我想在同一图上绘制系列的两个通道。每个系列应由一条根据通道着色的线表示。在这些线上,我想将系列的点绘制成点。这些颜色应根据相同形状的第二个2D Numpy array中的值进行着色。我的问题是:如何在两个通道共有的范围内为点设置颜色图?

我通过两次调用plt.plot()plt.scatter()来获得每个系列的不同颜色和点的线条,如下所示:

import matplotlib.pyplot as plt
import numpy as np

# Bivariate time-series of length 10
nchannel, length = 2, 10
array_series = np.random.random((nchannel, length))
array_colors = np.vstack([np.repeat(0, length), np.repeat(1, length)])

colormap = 'jet'
plt.plot(np.arange(length), array_series[0,:])
plt.scatter(np.arange(length), array_series[0,:], c=array_colors[0,:], cmap=colormap)
plt.plot(np.arange(length), array_series[1,:])
plt.scatter(np.arange(length), array_series[1,:], c=array_colors[1,:], cmap=colormap)

这将产生: Current output

这不是期望的输出,因为所有点都是深蓝色,因此array_colors中0和1之间的区别消失了。我正在寻找类似将plt.scatter(..., c=array_colors[i,:], cmap=colormap)替换为plt.scatter(..., c=array_colors, cmap=colormap)的方法。但是,后者会引发错误。任何解决此问题的想法都将受到欢迎!

2 个答案:

答案 0 :(得分:1)

我想您只能使用数组的平面版本:

import matplotlib.pyplot as plt
import numpy as np

# Bivariate time-series of length 10
nchannel, length = 2, 10
array_series = np.random.random((nchannel, length))
array_colors = np.random.random((nchannel, length))

x = np.arange(length)

plt.plot(x, array_series[0,:])
plt.plot(x, array_series[1,:])

xs = np.tile(x, nchannel)
plt.scatter(xs, array_series.flat, c=array_colors.flat)

plt.show()

答案 1 :(得分:1)

您可以使用参数vminvmax

vmin作为全局最小值,以vmax作为全局最大值。这将导致所有对scatter的调用在同一范围内缩放值,从而产生统一的色标。

示例:

import matplotlib.pyplot as plt
import numpy as np

nchannel, length = 2, 10
array_series = np.random.random((nchannel, length))
array_colors = np.vstack([np.repeat(0, length), np.repeat(1, length)])

colormap = 'jet'
vmin = np.min(array_colors)
vmax = np.max(array_colors)
x = np.arange(length)

plt.plot(x, array_series[0,:])
plt.scatter(x, array_series[0,:], vmin=vmin, vmax=vmax, c=array_colors[0,:], cmap=colormap)
plt.plot(x, array_series[1,:])
plt.scatter(x, array_series[1,:], vmin=vmin, vmax=vmax, c=array_colors[1,:], cmap=colormap)