绘制一个带有颜色的立方体

8

我在使用Matlab编写一个统计代码,用于生成各种图表。这些图表类型从简单的饼图和柱状图到3D直方图都有。

现在我们希望为软件添加一个漂亮的GUI界面。我们有一个原型的Matlab GUI,但是Matlab的GUI存在一些问题,所以我们想转向更强大的GUI。目前看来,我最好的选择似乎是PySide + matplotlib,但是到目前为止,我还没有找到一种方法来绘制3D直方图。Matlab代码使用contourslice函数,而matplotlib中似乎没有类似的调用。所以,有人能帮我想出如何使用matplotlib绘制这样的图表吗?到目前为止,我唯一的想法是绘制6个曲面来组成一个立方体。

实际上,对于其他GUI/图表库组合的推荐也是受欢迎的。基础统计代码是C++,所以Python只是众多选项之一。根据我在StackOverflow上看到的一些答案,matplotlib在3D方面可能速度过慢。也许R会更好?

A colored 3D cube made with contourslice

这是 Matlab 代码:
clf
xlo = -1.800000e+01; 
xhi = 1.000000e+01; 
ylo = 1.000000e+01; 
yhi = 3.000000e+01; 
zlo = -1.000000e+03; 
zhi = 1.000000e+03; 
X=zeros(16,16,16);
Y=zeros(16,16,16);
Z=zeros(16,16,16);
V=zeros(16,16,16);
% fill in X, Y, Z, and V  huge amount of text
xt = [-1.800000e+01:2.800000e-01:1.000000e+01];
yt = [1.000000e+01:2.000000e-01:3.000000e+01];
zt = [-1.000000e+03:2.000000e+01:1.000000e+03];
isoval = -1.428280e+01;
h = patch(isosurface(X,Y,Z,V,isoval),... 
'FaceColor', 'blue', ... 
'EdgeColor', 'none', ... 
'AmbientStrength', 0.2, ... 
'SpecularStrength', 0.7, ... 
'DiffuseStrength', 0.4);
isonormals(X,Y,Z,V,h);
patch(isocaps(X,Y,Z,V,isoval), ...
'FaceColor', 'interp', ... 
'EdgeColor', 'none'); 
axis([xlo xhi ylo yhi zlo zhi])
daspect([2.800000e+01,2.000000e+01,2.000000e+03])
set(gca,'linewidth',2)
set(gca,'fontweight','bold')
set(gca,'fontsize',12)
grid on
box on
colormap('default'); colorbar

view(3) 
set(gcf,'Renderer','zbuffer')
lighting phong
cin = 'n';
if (cin == 'y')
xin = questdlg('Axis to slide through ?', 'Axis', 'X', 'Y', 'Z', 'X');
xin = lower(xin);
for i = 1 : 101
if gcf ~= plotFigure
return
end
if (xin == 'y')
h = contourslice(X,Y,Z,V,xt(i),[],[],101);
elseif (xin == 'x')
h = contourslice(X,Y,Z,V,[],yt(i),[],101);
elseif (xin == 'z')
h = contourslice(X,Y,Z,V,[],[],zt(i),101);
end
axis([-1.8000e+01  1.0000e+01  1.0000e+01  3.0000e+01 -1.0000e+03  1.0000e+03 -8.6774e+01  4.2066e+02])
set(gca,'linewidth',2)
set(gca,'fontweight','bold')
set(gca,'fontsize',12)
grid on
box on
view(3)
set(h, 'Linewidth', 10)
colorbar
pause(0.3)
if (i < 101)
clf
end
end
end

为什么Matlab对你来说不起作用? - jerad
继续使用Matlab是一种可能性。我需要尝试一下Matlab编译器,看看它是否允许我在不要求用户拥有Matlab许可证的情况下进行分发。我的主要抱怨是它不够动态,例如我无法即时扩展表格。它也很慢,有点不稳定。 - Jim
可以将编译后的应用程序分发给终端用户,而无需他们拥有Matlab许可证。他们只需要安装免费提供的MCR(Matlab Runtime Compiler)。至于速度,在大多数情况下,Python肯定不会更快。 - jerad
此外,这个不错的将Java Swing功能集成到Matlab GUI中。 - jerad
问题不在于Matlab编译器是否适用于某些情况,而在于它是否适用于我的情况。 :) 我曾认为由于统计软件包与Matlab的交互方式有些奇怪,它可能不适用于我的情况,但我想我可能知道如何解决这些问题了。感谢提供Swing链接。还有更多工具可以尝试... - Jim
1个回答

2

你可以查看 mayavi

如果你正在使用 Windows,它默认带有Python(x,y)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接