Matplotlib,3D logaxis,不完整的图

时间:2014-03-05 18:08:41

标签: python matplotlib 3d

我正在使用matplotlib,我想要一个带对数轴的3d图形。我正在尝试一些代码,比如下面的代码,但我一次只能看到部分图形,如果我试图移动它,我可以看到其他部分,但是,不完整。

有没有人知道如何制作带有日志轴的3D图?

如果轴是线性的,我可以看到3D图像,但是一旦我改为“log”,我只能看到它的一部分。

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()

2 个答案:

答案 0 :(得分:1)

我将matplotlib更新为1.3.1,现在我可以看到完整的数字。现在,我认为轴不是对数刻度。我在matplotlib matplotlib和gnuplot gnuplot绘制了一个图,可以看出每个10的幂之间的距离是完全不同的。

答案 1 :(得分:-1)

3d scatter plot需要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