Matplotlib,3D对数轴,不完整的图形。

3
我正在使用matplotlib进行开发,希望能够创建一个带有对数坐标轴的3D图形。我尝试了以下代码,但每次只能看到部分图像,如果我尝试移动它,我可以看到其他部分,但不是完整的图像。
请问有谁知道如何制作带有对数坐标轴的3D图形吗?
当坐标轴是线性的时候,我可以看到3D图像,但是一旦我将其更改为“对数”,我只能看到其中的一部分。
import matplotlib as mpl
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt   
data=np.array([[1,10,100],[10,1,1],[2,20,82]])
fig=plt.figure()
ax=Axes3D(fig)
#ax.set_xlim3d(0.1,15)
#ax.set_ylim3d(0.1,15)
#ax.set_zlim3d(0.1,15)
ax.xaxis.set_scale('log')
ax.yaxis.set_scale('log')
ax.zaxis.set_scale('log')
ax.scatter(data[:,0],data[:,1],data[:,2])
plt.show()

仅仅一次只能看到情节的一部分是什么意思?只有三个点中的一个点吗?去掉 set_(you_name_it)lim3d 应该会显示所有的点。 - CT Zhu
1
请看:https://github.com/matplotlib/matplotlib/issues/209 - tacaswell
就好像情节比画布还要大一样,不幸的是我无法附加图片 :( - joc
2个回答

1
我已将 matplotlib 更新至 1.3.1 版本,现在可以看到完整的图形。但是,我认为轴不是以对数刻度表示的。我使用 matplotlib 绘制了一张图 matplotlib ,并使用 gnuplot 绘制了相同的图 gnuplot ,可以看出每个10的幂之间的距离完全不同。

-1

3D散点图需要x、y、z参数:如果您想绘制z数据[:,2](3个点)关于x数据[:,0]和y数据[:,1]的函数,当xlim3d、ylim3d、zlim3d正确设置时,您将看到3个点。这可以通过将它们设置为每个x、y、z值的min()和max()来完成:

import matplotlib as mpl
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
data=np.array([[1,10,100],[10,1,1],[2,20,82]])
fig=plt.figure()
ax=Axes3D(fig)
ax.set_xlim3d(data[:,0].min(),data[:,0].max())
ax.set_ylim3d(data[:,1].min(),data[:,1].max())
ax.set_zlim3d(data[:,2].min(),data[:,2].max())
ax.xaxis.set_scale('log')
ax.yaxis.set_scale('log')
ax.zaxis.set_scale('log')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.scatter(data[:,0],data[:,1],data[:,2])
plt.show()

enter image description here

现在,如果您想以3D方式绘制数据数组(在这种情况下为9个点),则需要相应的x和y轴。这可以通过np.meshgrid()完成。在此示例中,我已将x、y设置为等距[1,2,3]。

import matplotlib as mpl
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
data=np.array([[1,10,100],[10,1,1],[2,20,82]])
datax=np.array([1,2,3])
datay=np.array([1,2,3])
dataxM,datayM = np.meshgrid(datax, datay)

fig=plt.figure()
ax=Axes3D(fig)
ax.set_xlim3d(datax.min(),datax.max())
ax.set_ylim3d(datay.min(),datay.max())
ax.set_zlim3d(data.min(),data.max())
ax.xaxis.set_scale('log')
ax.yaxis.set_scale('log')
ax.zaxis.set_scale('log')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.scatter(dataxM,datayM,data)
plt.show()

enter image description here


我看到这是可以做到的,但问题可能出在我的电脑上。我正在使用Debian系统,想要上传一张图片,但由于我还是新手,我的声望还不足以发布图片。 - joc
你使用的是哪个版本的Python?我在Debian Wheezy上运行的是Python 2.7.3。也许我的版本有问题。 - joc
1
这个回答中没有使用对数坐标轴。这不是问题的真正答案。 - abcd

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