我有以下代码生成表面密度图。 x和y是位置坐标,z轴表示密度。所有值都是预先计算出来的,并存储在numpy数组中。
#set up the grid
xi, yi = np.linspace(x.min(), x.max(), 200), np.linspace(y.min(), y.max(), 200)
xi, yi = np.meshgrid(xi, yi)
#interpolate
rbf = scipy.interpolate.Rbf(x, y, z, function='linear')
zi = rbf(xi, yi)
plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower', extent=[x.min(), x.max(), y.min(), y.max()])
plt.scatter(x, y, c=z,marker='o')
plt.colorbar()
plt.scatter(xo,yo, c='b', marker='*')
plt.xlabel("RA(degrees)")
plt.ylabel("DEC(degrees)")
plt.title('Surface Density Plot 2.0 < z < 2.2')
plt.savefig('2.0-2.2.png', dpi= 300 )
plt.show()
我遇到的问题是xaxis刻度不是用户友好的术语,它们是150-152之间的值,但我似乎无法使用xticks()函数更改刻度位置。 有人会建议我如何格式化x轴吗?
编辑 - 这些是用于绘图的xyz的值。 x,y,z是三个numpy数组 - https://www.dropbox.com/s/l03pkzplqmfm1su/xyz.csv 第一行是x值,第二行是y,第三行是z。
答案 0 :(得分:1)
使用pyplot界面时,您可以设置xticks via(假设您导入的matplotlib.pyplot为plt)
plt.xticks(*args, **kwargs)
您可以给出刻度位置,例如。作为列表或numpy数组,并将tick-labels作为touple(或list,...)。
但是,请包含我们可以运行的代码的最小示例,因此我们可以测试它是否正常工作并查看原因,如果是这样的话。此外,您似乎已将matplotlib导入为plt,但您的某些命令(如xlabel
)缺少plt.
部分。这只是一个拼写错误或复制/粘贴错误?
如果你想要更好地调整你的刻度和刻度格式,你应该考虑使用matplotlib的OO接口。是的,它更冗长,你必须输入更多的字母,但在我看来,代码变得更加清晰,你有更多的可能性使图表适应你的期望。
修改:据我所知,您对xtick标签的格式不满意。因此,您可能想要“150.0”左右而不是“0.0”“+ 1.5e2”。查看(使用pyplot界面)的功能是:
plt.ticklabel_format(**kwargs)
这里显示了kwargs here。如果style='plain'
符合您的要求,您应该尝试。
我想再次强调,OO界面为您提供了更多功能,可以更改刻度标签的格式。各自的职能是:
matplotlib.axes.yaxis.set_major_formatter()
matplotlib.axes.xaxis.set_major_formatter()
您可以选择几种格式化程序,甚至可以编写自己的格式化功能。如果你想这样做,我可以给你进一步的建议。
答案 1 :(得分:0)
Firefly,基于您在评论中提供的dropbox image我相信以下内容描述了您的问题。 x数据的大小比变化大得多,因此python有一个值列表,如
[150.05,150.10,150.15,150.20,150.25]
对于这个图中的xax来说太大了,所以python做了一些你不喜欢的聪明的事情(我同意)。
一个修复可能是简单地将xticks设置为垂直,例如
py.xticks(rotation='vertical')
如果你无法手动执行python尝试的操作,那么从x轴减去150度并更改你的xlabel就可以了
plt.xlabel("RA+150(degrees)")
如果您的数据不是度数,我会改为建议重新缩放(例如除以1e2),但使用度数看起来很奇怪。