【问题标题】:Barchart (o plot) 3D in PythonPython中的条形图(o图)3D
【发布时间】:2010-10-25 00:19:58
【问题描述】:

我需要以各种形式绘制一些数据。目前我正在使用Matplotlib,我对我能够制作的情节相当满意。

这个问题是关于如何绘制最后一个。数据类似于“距离表”,例如this(只是更大,我的表是 128x128,每个元素仍然有 3 个或更多数字)。

现在,我的数据比距离表“结构化”要好得多(我的数据不会像按字母顺序排序的距离表那样“随机”变化),因此 3D barchart 或其中的 3 个会完美。我的理解是 Matplotlib 中缺少这样的图表。

我可以使用像 these 这样的(彩色)Countor3d 或像 imshow 这样的 2D 东西,但它并不能很好地代表数据是什么(数据仅在我的 128 点中有意义,没有两点之间的任何东西)。而且条形的高度比颜色更易读,IMO。

因此问题:

  1. 是否可以在 Matplotlib 中创建 3D 条形图?应该清楚的是,我的意思是 2D 域,而不仅仅是出于美学目的而带有“假”3D 渲染的 2D 条形图
  2. 如果上一个问题的答案是否定的,那么是否有其他库能够做到这一点?我非常喜欢基于 Python 的东西,但我对其他 Linux 友好的可能性没意见
  3. 如果上一个问题的答案是否定的,那么您对如何显示该数据有什么建议吗?例如。创建一个包含值的表格,叠加到 imshow 或其他彩色方式?

【问题讨论】:

    标签: python matplotlib plot 3d


    【解决方案1】:

    MyavaVi2 可以变成3D barcharts(向下滚动一点)。一旦你有MayaVi/VTK/ETS/等。安装它一切都很好,但安装它可能需要一些工作。 Ubuntu 已将其全部打包,但它们是我所知道的唯一一个这样做的 Linux 发行版。

    【讨论】:

    • 看起来不错,在 Ubuntu 中安装是小菜一碟,只需 sudo apt-get install mayavi2 不幸的是,该示例不起作用: from enthought.mayavi.mlab import * ImportError: No module named mlab while (网上找到的建议) from enthought.mayavi.tools.mlab import * 可以,但是不提供 barchart() 建议?
    • 你有什么版本的 mayavi2?我相信 mlab 已针对 3.1.0 版本进行了大修,这就是文档所涵盖的内容。
    • “mayavi2 -V”给出“MayaVi 2.0.2a1”
    • 你很耐寒吗?根据packages.ubuntu.com/search?searchon=names&keywords=mayavi2 的说法,您可能需要 jaunty 来获得一个新版本的 mayavi2,该版本足够新,可以包含条形图。向后移植一个包有多难?
    • 不,我不能使用它,但我将您的答案标记为已接受,因为您指出了一个我不知道的非常好的工具
    【解决方案2】:

    一段时间以来,matplotlib 没有 3D 支持,但它已被添加回 recently。您将需要使用 svn 版本,因为此后没有发布任何版本,并且文档有点稀疏(请参阅示例/mplot3d/demo.py)。我不知道 mplot3d 是否支持真正的 3D 条形图,但其中一个演示看起来有点像它可以扩展到类似的东西。

    编辑:演示的源代码在the examples,但由于某种原因结果不是。我的意思是test_polys 函数,它是这样的:

    example figure http://www.iki.fi/jks/tmp/poly3d.png

    test_bar2D 函数会更好,但它在演示中被注释掉,因为它会导致当前 svn 版本出错。可能是一些微不足道的问题,或者更难解决的问题。

    【讨论】:

    • 可以在网上看到演示结果吗?如果没有,您可以在本地机器上运行它并编辑您的答案以显示源代码和生成的图片吗?
    • 谢谢,我不接受你的回答,因为它现在不起作用,但我赞成它,我期待看到它起作用
    【解决方案3】:

    您可以查看 Chart Director:

    http://www.advsofteng.com

    它有各种各样的图表和图形,并有一个很好的 Python(和其他几种语言)API。

    有两个版本:免费版会在生成的图像上添加简介,而 付费版的价格相当合理。

    这是看起来更有趣的 3d 堆叠条形图之一:


    (来源:advsofteng.com

    【讨论】:

      【解决方案4】:

      另一种可能性是 Gnuplot,它可以绘制某种pseudo 3D bar charts,而gnuplot.py 允许从 Python 连接到 Gnuplot。不过我自己没试过。

      【讨论】:

      • +1 哇,gnuplot 来自 python 的后门 :-) 我在 90 年代经常使用它...我会看看它(但伪 3D 条形图与较新的工具相比,它们很难看...)
      【解决方案5】:

      这是我使用 matplotlib 制作简单 Bar-3d 的代码。

      import mpl_toolkits
      from mpl_toolkits.mplot3d import Axes3D   
      import matplotlib.pyplot as plt
      %matplotlib inline
      
      ## The value you want to plot 
      zval=[0.020752244,0.078514652,0.170302899,0.29543857,0.45358061,0.021255922,0.079022499,\
        0.171294169,0.29749654,0.457114286,0.020009631,0.073154019,0.158043498,0.273889264,0.419618287]    
      
      fig = plt.figure(figsize=(12,9))
      ax = fig.add_subplot(111,projection='3d')
      col=["#ccebc5","#b3cde3","#fbb4ae"]*5
      xpos=[1,2,3]*5
      ypos=range(1,6,1)*5
      zpos=[0]*15
      dx=[0.4]*15
      dy=[0.5]*15
      dz=zval
      
      for i in range(0,15,1):
           ax.bar3d(ypos[i], xpos[i], zpos[i], dx[i], dy[i], dz[i],     
      color=col[i],alpha=0.75)
      
      ax.view_init(azim=120)
      plt.show()      
      

      http://i8.tietuku.com/ea79b55837914ab2.png

      【讨论】:

      • 参加聚会有点晚了(我什至不记得我当时试图绘制什么!)但很高兴看到这个功能最终在 matplotlib 中实现
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 2011-05-28
      • 1970-01-01
      • 2023-01-21
      • 2012-02-19
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多