格式化x轴标记

2024-05-16 01:12:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码来生成表面密度图。 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


Tags: numpynpplt数组minmarkermax密度
2条回答

使用pyplot接口时,可以通过设置xticks(前提是将matplotlib.pyplot导入为plt)

plt.xticks(*args, **kwargs)

你可以给出记号的位置,例如作为一个列表或一个numpy数组,记号标签作为一个touple(或list,…)。

但是,请包含一个我们可以运行的代码的最小示例,这样我们就可以测试它是否工作了,如果是这样的话,看看为什么不行。另外,您似乎已经将matplotlib导入为plt,但是您的一些命令(如xlabel)缺少plt.部分。这只是一个打印错误或复制/粘贴错误吗?

如果希望对记号和记号格式进行更多微调,则应考虑使用matplotlib的OO接口。是的,它更加冗长,您必须键入更多的字母,但在我看来,代码变得更加清晰,您有更多的可能性调整图形以满足您的期望。

编辑:据我从您的评论中了解,您对xtick标签的格式不满意。因此,您可能希望使用“150.0”左右,而不是“0.0”“+1.5e2”。要查看的函数(使用pyplot接口)是:

plt.ticklabel_format(**kwargs)

克瓦格在这里显示。如果style='plain'符合您的要求,您应该试试。

我要再次强调,OO接口使您能够更灵活地更改tick标签的格式。各自的职能是:

matplotlib.axes.yaxis.set_major_formatter()
matplotlib.axes.xaxis.set_major_formatter()

您可以在多个格式化程序之间进行选择,甚至可以编写自己的格式化函数。如果你想那样做,我可以给你进一步的建议。

萤火虫,基于你在评论中给出的dropbox image我相信下面描述了你的问题。x数据的大小远远大于变量,因此python有一个值列表,如

[150.05,150.10,150.15,150.20,150.25] 

这对于这个图中的xaxis来说太大了,所以python做了一些您不喜欢的聪明的事情(我同意)。

一种解决方法是简单地将xticks设置为垂直,例如

py.xticks(rotation='vertical')

如果失败,您可以手动执行python所尝试的操作,从x轴减去150度并更改xlabel,以便

plt.xlabel("RA+150(degrees)")

如果你的数据不是度数,我建议改为重定比例(例如除以1e2),但用度数,这看起来很奇怪。

相关问题 更多 >