Python 2.7 使用颜色贴图matplotlib进行堆栈打印

Python 2.7 使用颜色贴图matplotlib进行堆栈打印,python-2.7,matplotlib,scatter-plot,stacked-area-chart,Python 2.7,Matplotlib,Scatter Plot,Stacked Area Chart,我想用中给出的颜色贴图绘制堆栈图。这里有一个相同的截图 目前,我能画出类似性质的散点图 我想将此散点图转换为带有彩色贴图的堆栈图。我对做这件事的想法有点迷茫。我最初的猜测是,对于每个(x,y)点,我需要在彩色贴图光谱上列出z点。然而,我想知道是否有更简单的方法。这是我用彩色地图生成散点图的代码 cm = plt.cm.get_cmap('RdYlBu') plt.xscale('log') plt.yscale('log') sc = plt.scatter(x, y, c=z, marke

我想用中给出的颜色贴图绘制堆栈图。这里有一个相同的截图

目前,我能画出类似性质的散点图

我想将此散点图转换为带有彩色贴图的堆栈图。我对做这件事的想法有点迷茫。我最初的猜测是,对于每个(x,y)点,我需要在彩色贴图光谱上列出z点。然而,我想知道是否有更简单的方法。这是我用彩色地图生成散点图的代码

cm = plt.cm.get_cmap('RdYlBu')
plt.xscale('log')
plt.yscale('log')
sc = plt.scatter(x, y, c=z, marker ='x', norm = matplotlib.colors.Normalize(vmin= np.min(z), vmax=np.max(z)), s=35, cmap=cm)
plt.colorbar(sc)
plt.show()
编辑

我觉得我需要找到一种方法,将
z-array
转换为多个
z-array
——颜色栏上每个箱子一个。然后,我可以简单地从这些衍生的
z-阵列
创建一个堆叠面积图

编辑2

我跟随并能够为我的数据生成这个图表。我想知道为什么轴的限制会有问题


从您的示例
散点图来看,您有很多要点。将这些数据打印为单个数据将覆盖大部分数据,并且只显示“顶部”数据。这是一种不好的做法,当您有这么多数据时,进行一些聚合将改进视觉表示

下面的示例显示了如何使用二维直方图来
bin
和平均数据。一旦数据以适当的格式进行可视化显示,将结果打印为图像或轮廓就相当简单了

打印前聚合数据还可以提高性能,并防止阵列过大或与内存相关的错误

fig, ax = plt.subplots(1, 3, figsize=(15,5), subplot_kw={'aspect': 1})

n = 100000

x = np.random.randn(n)
y = np.random.randn(n)+5
data_values = y * x

# Normal scatter, like your example
ax[0].scatter(x, y, c=data_values, marker='x', alpha=.2)
ax[0].set_xlim(-5,5)


# Get the extent to scale the other plots in a similar fashion
xrng = list(ax[0].get_xbound())
yrng = list(ax[0].get_ybound())

# number of bins used for aggregation
n_bins = 130.

# create the histograms
counts, xedge, yedge = np.histogram2d(x, y, bins=(n_bins,n_bins), range=[xrng,yrng])
sums, xedge, yedge = np.histogram2d(x, y, bins=(n_bins,n_bins), range=[xrng,yrng], weights=data_values)

# gives a warning when a bincount is zero
data_avg = sums / counts

ax[1].imshow(data_avg.T, origin='lower', interpolation='none', extent=xrng+yrng)

xbin_size = (xrng[1] - xrng[0])  / n_bins # the range divided by n_bins
ybin_size = (yrng[1] - yrng[0])  / n_bins # the range divided by n_bins

# create x,y coordinates for the histogram
# coordinates should be shifted from edge to center
xgrid, ygrid = np.meshgrid(xedge[1:] - (xbin_size / 2) , yedge[1:] - (ybin_size / 2))

ax[2].contourf(xgrid, ygrid, data_avg.T)

ax[0].set_title('Scatter')
ax[1].set_title('2D histogram with imshow')
ax[2].set_title('2D histogram with contourf')

图库中有
stackplot
示例:但当查看您的数据时,我怀疑您是否需要,stackplot是针对不同系列的。看起来你更像是在寻找等高线图:@RutgerKassies你能解释一下原因吗?我在示例部分和其他来源中尝试了等高线图,但它并没有真正反映我发布的图。我觉得z值有6个箱子,然后我需要使用堆叠面积图来绘制。@Dexter-您有分散的点,每个点都有一个x、y、z值,而不是一系列的线。堆叠图只是一系列线,每个线之间的间隔都填满了。您想要的(以及链接到的图中所示的)是给定多个x、y、z观测值的插值“z”值的等高线图。您需要将分散的数据插值到规则网格上,然后使用
contourf
。另外,在调用分散时,如果您所做的只是一个线性比例,则不需要指定自定义的
norm
。完全不使用
norm
参数将产生与当前代码完全相同的效果。希望对你有所帮助@德克斯特-不,只是你基本上不能用
stackplot
做你想做的事。(例如,请注意图中试图复制的“孤岛”)如果要尝试使用
stackplot
,则必须先使用
等高线
来识别具有恒定“z”值的线,然后再使用
stackplot
进行打印
contourf
基本上只需一步即可完成,但它的绘图方式比stackplot
更加灵活(例如,它将愉快地处理“孤岛”:也称为闭合轮廓)。感谢您提供详细的代码和解释。这真的很有帮助。我现在得到的图(我编辑了我的原始帖子)中有一些轴的限制问题。原因可能是什么?