1

I've got the following code that generates a surface density plot. x and y are position co=ordinates and z axis represents the density. All the values are pre calculated and is stored in a numpy array.

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

The problem I have is the xaxis ticks are not in user friendly terms, they are values between 150-152 but I can't seem to change the ticks positions using the xticks() function. Would anyone have a suggestion how I can go about to formatting the x axis?

edit- These are the values for xyz used for the plot. x,y,z are three numpy arrays- https://www.dropbox.com/s/l03pkzplqmfm1su/xyz.csv the first row is x values, second the y and third the z.

4

2 回答 2

1

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

plt.xticks(*args, **kwargs)

您可以给出刻度位置,例如。作为列表或 numpy 数组,刻度标签作为 touple(或列表,...)。

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

如果你想对你的刻度和刻度格式进行更多微调,你应该考虑使用 matplotlib 的 OO 接口。是的,它更冗长,您必须输入更多字母,但在我看来,代码变得更加清晰,您有更多可能使图表适应您的期望。

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

plt.ticklabel_format(**kwargs)

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

我想再次强调,OO 界面为您提供了更多功能来更改刻度标签的格式。各自的功能是:

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

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

于 2013-04-24T09:16:23.307 回答
0

Firefly,根据您在评论中给出的Dropbox 图像,我相信以下内容描述了您的问题。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),但是对于度数,这看起来很奇怪。

于 2013-04-24T15:07:52.587 回答