格式化x轴刻度

时间:2013-04-24 04:58:23

标签: python matplotlib

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

2 个答案:

答案 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),但使用度数看起来很奇怪。