python - 编辑曲面图上的轴外观
问题描述
我的代码为以下数据绘制了一个曲面图。我想改变 X 和 Y 轴的外观。现在它只显示 10 和 100。如何编辑它以便它也显示它们之间的值?我还没有理解代码中tickformatter的使用,我收到了论坛上一位成员对我上一个问题的建议。
(请注意:图像用于reresentation目的,以下数据给出了相似的图像但具有不同的值)
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter, FuncFormatter
from mpl_toolkits.mplot3d import axes3d
import numpy as np
def format_log(x, pos=None):
x1 = 10**x
s = "%.3f" % x1
return s[:-4] if s[-3:]=="000" else " "
fig = plt.figure()
ax = fig.gca(projection='3d')
X=[2,3,5,8,20,30,50,80,100,150,175,200,250,300]
Y=[2,3,4,5,10,15,20,30,40,50,80,100,125,150,175,200]
X = np.log10(np.array(X))
Y = np.log10(np.array(Y))
Y,X=np.meshgrid(Y,X)
Z=np.array([
[0.2885307,0.269452,0.259193,0.2548041,0.2731868,0.4801551,0.7992361,1.7577641,3.2611327,5.428839,19.647976,37.59729,78.0871,152.21466,268.14572,0],
[0.2677955,0.2538363,0.2380033,0.2306999,0.4779794,0.9251045,1.5448972,3.508644,6.4968576,11.252151,0,0,0,0,0,0],
[0.2432982,0.2283371,0.2514196,0.3392502,0,0,0,0,0,0,0,0,0,0,0,0],
[0.2342575,0.3158406,0.4770729, 0.6795485,2.353042, 5.260077,9.78172,25.87004,59.52568, 0,0,0,0,0,0,0],
[0.6735384, 1.3873291,2.346506, 3.5654,0,0,0,0,0,0,0,0,0,0,0,0],
[1.3584715, 2.9405127,5.096819,8.155857,0,0,0,0,0,0,0,0,0,0,0,0],
[3.558062,8.216592,15.768077,27.386694,0,0,0,0,0,0,0,0,0,0,0,0],
[9.537899,25.202589,58.20041,0,0,0,0,0,0,0,0,0,0,0,0,0],
[16.083374,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[54.936775,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[89.185974,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])
my_col = cm.jet(Z/np.amax(Z))
surf = ax.plot_surface(X, Y, Z,cmap=cm.coolwarm)
ax.set_zlim(0, 300)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
ax.xaxis.set_major_formatter(FuncFormatter(format_log))
ax.yaxis.set_major_formatter(FuncFormatter(format_log))
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
解决方案
如果您可以手动指定所有刻度线,您可以添加类似
ax.set_xticks([np.log10(x) for x in [10, 20, 60, 100]])
ax.set_yticks([np.log10(y) for y in [10, 30, 60, 100]])
此外,您可以在此处关注 3D-log scale 问题的“进展” 。
推荐阅读
- asp.net-core - 具有 Redis 持久性的 MassTransit 传奇使 Method Accpet 没有实现异常
- angular - 在拦截器中捕获一些错误
- selenium - Selenium:在 XPath 中循环
- c# - 是否可以使用视觉工作室从和向 android firebase 接收和发送数据到 mysql
- ms-access - MS Access 2013 - 让列表框像 excel 切片器一样工作
- usb - Windows CE 上的未知 USB 设备
- amazon-web-services - 带有 WWW 的 URL 仅适用于首次加载 Elastic Beanstalk
- linux - Bash - 从文件中读取行时打印第一列和第二列
- python - Django:自动建议使用 Elasticsearch DSL
- numpy - 在 PyCharm 中导入 NumPy 时出错