【问题标题】:3D-Stacked 2D histograms in matplotlib pyplotmatplotlib pyplot 中的 3D 堆叠 2D 直方图
【发布时间】:2013-12-24 01:40:58
【问题描述】:

我有一堆 2D 直方图(方形 2D numpy 数组),我想像这样堆叠成 3D:

(图片来自:Cardenas、Alfredo E. 等人。“N-乙酰基-L-色氨酸酰胺通过膜的无辅助转运:动力学实验和模拟。”The Journal of Physical Chemistry B 116.9 (2012): 2739-第2750章)

有没有人有任何好主意如何做到这一点?我已经尝试过Python plot - stacked image slices 的contourf 方法,但结果并不理想。

谢谢。

【问题讨论】:

  • 您能否详细说明您当前的设置有哪些问题?您还应该分享一些您编写的代码和您制作的图像。现在,你不是在问一个具体的问题。

标签: numpy matplotlib plot


【解决方案1】:

我建议您使用Axes3D.plot_surface 绘制平面,并使用facecolor 参数为它们着色,如下所示:

import numpy;
from matplotlib import pyplot;
from matplotlib import cm;
from mpl_toolkits.mplot3d import Axes3D;
pyplot.interactive(True);

# Creat mesh.
X = numpy.arange(-1, 1, 0.1);
Y = numpy.arange(-1, 1, 0.1);
X, Y = numpy.meshgrid(X, Y);

# Create some data to plot.
A = numpy.copy(X);
B = numpy.copy(Y);
C = numpy.sqrt(X**2 + Y**2);
D = numpy.cos(C);
# Normalize data for colormap use.
A -= numpy.min(A); A /= numpy.max(A);
B -= numpy.min(B); B /= numpy.max(B);
C -= numpy.min(C); C /= numpy.max(C);
D -= numpy.min(D); D /= numpy.max(D);

# Create flat surface.
Z = numpy.zeros_like(X);

# Plot
fig = pyplot.figure();
ax = fig.gca(projection='3d');
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors = cm.coolwarm(A));
ax.plot_surface(X, Y, Z+0.1, rstride=1, cstride=1, facecolors = cm.coolwarm(B));
ax.plot_surface(X, Y, Z+0.2, rstride=1, cstride=1, facecolors = cm.coolwarm(C));
ax.plot_surface(X, Y, Z+0.3, rstride=1, cstride=1, facecolors = cm.coolwarm(D));

【讨论】:

    【解决方案2】:

    为了补充@Bence 的答案,可以使用here 中的sn-p 代码添加额外的垂直颜色条。具体来说,我使用了以下代码,其中“xxx”是我的数据集,其中 Bence 图中显示的每一层都是 dstack'd numpy 数组中的单独 z 层。 :

    m = cm.ScalarMappable(cmap=cm.jet)
    m.set_array(xxx)
    pyplot.colorbar(m)
    pyplot.show()
    

    【讨论】: