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

3 投票
2 回答
2935 浏览
提问于 2025-04-17 20:58

我在玩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()

2 个回答

-1

要画一个三维散点图,你需要提供x、y和z这三个参数。如果你想用z数据中的第三列(也就是data[:,2])来表示x数据中的第一列(data[:,0])和y数据中的第二列(data[:,1]),那么只要把x、y、z的范围(xlim3d、ylim3d、zlim3d)设置正确,你就能看到3个点。你可以通过把它们设置为每个x、y、z值的最小值和最大值来实现这一点:

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

如果你想以三维的方式绘制数据数组,比如这里的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

1

我把matplotlib更新到了1.3.1,现在我可以看到完整的图形了。不过,我觉得坐标轴好像不是对数刻度。我用matplotlib做了一个图 matplotlib,然后又用gnuplot做了同样的图 gnuplot,可以看出每个10的幂之间的距离完全不同。

撰写回答