2012-12-27 21 views
14

私はHacker's Delightからこのようなプロットを作りたい:Pythonで3Dヒストグラムをレンダリングするにはどうすればよいですか?

enter image description here

Pythonでこれを実現するためにそこにあるどのような方法?インタラクティブにグラフを調整する(現在観察されているX/Yスライスを変更する)ことが容易になるソリューションが理想的です。

matplotlibもmplot3dモジュールも、この機能はAFAICTではありません。私はmayavi2が見つかりましたが、それは非常にclunky(私もサイズを調整するためのオプションを見つけることができません)ipythonから実行すると正しく動作するように見えます。

gnuplotはうまくいくかもしれませんが、私はこのために別の言語構文を学ばなくてはなりません。

+16

これはmatplotlibのサポートされています。これを見てください:http://matplotlib.org/examples/mplot3d/hist3d_demo.html – TJD

+0

@TJD:良い発見。 Yikes、その例は、見えないように見えます。 –

+0

['barchart()'](http://docs.enthought.com/mayavi/mayavi/mlab.html)を試しましたか? – Developer

答えて

19

の例では、ここに「不可解」に見えたTJDが指摘するので、物事を明確に役立つかもしれないいくつかのコメントと修正したバージョンです:

#! /usr/bin/env python 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 
# 
# Assuming you have "2D" dataset like the following that you need 
# to plot. 
# 
data_2d = [ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
      [6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
      [11, 12, 13, 14, 15, 16, 17, 18 , 19, 20], 
      [16, 17, 18, 19, 20, 21, 22, 23, 24, 25], 
      [21, 22, 23, 24, 25, 26, 27, 28, 29, 30] ] 
# 
# Convert it into an numpy array. 
# 
data_array = np.array(data_2d) 
# 
# Create a figure for plotting the data as a 3D histogram. 
# 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
# 
# Create an X-Y mesh of the same dimension as the 2D data. You can 
# think of this as the floor of the plot. 
# 
x_data, y_data = np.meshgrid(np.arange(data_array.shape[1]), 
           np.arange(data_array.shape[0])) 
# 
# Flatten out the arrays so that they may be passed to "ax.bar3d". 
# Basically, ax.bar3d expects three one-dimensional arrays: 
# x_data, y_data, z_data. The following call boils down to picking 
# one entry from each array and plotting a bar to from 
# (x_data[i], y_data[i], 0) to (x_data[i], y_data[i], z_data[i]). 
# 
x_data = x_data.flatten() 
y_data = y_data.flatten() 
z_data = data_array.flatten() 
ax.bar3d(x_data, 
      y_data, 
      np.zeros(len(z_data)), 
      1, 1, z_data) 
# 
# Finally, display the plot. 
# 
plt.show() 
関連する問題