我正在尝试使用以下代码更改x轴上的刻度值和imshow
图:
import matplotlib.pyplot as plt
import numpy as np
def scale_xaxis(number):
return(number+1001)
data = np.array([range(10),range(10,20)])
fig = plt.figure(figsize=(3,5))
ax = fig.add_subplot(111)
ax.imshow(data,aspect='auto')
ax.autoscale(False)
xticks = ax.get_xticks()
ax.xaxis.set_ticklabels(scale_xaxis(xticks))
plt.savefig("test.png")
Resulting image http://ubuntuone.com/2Y5ujtlEkEnrlTcVUxvWLU
然而,x-ticks重叠并具有“非圆形”值。 matplotlib有什么方法可以自动执行此操作吗?是使用set_ticklabels
还是其他方式?
答案 0 :(得分:7)
另请考虑使用extent
(doc)让matplotlib
完成所有关于如何放入刻度标签并添加任意班次的想法:
data = np.array([range(10),range(10,20)])
fig = plt.figure(figsize=(3,5))
ax = fig.add_subplot(111)
ax.imshow(data,aspect='auto',extent=[10000,10010,0,1])
如果你肯定想亲自动手,最好设置formatter
的{{1}}和locator
以获得你想要的(doc)。< / p>
axis
需要设置定位器以确保不会将滴答放在非整数位置,然后由格式化程序强制转换为整数(这会将它们放在错误的位置)
相关问题:
matplotlib: format axis offset-values to whole numbers or specific number
答案 1 :(得分:2)
有几种方法可以做到这一点。
你可以:
最后一个选项对于这么简单的事情来说太过分了。
作为第一个选项的示例,您可以将scale_xaxis
函数更改为:
def scale_xaxis(numbers):
return numbers.astype(int) + 1001
请注意,您从ax.get_xticks
获得的是一个numpy数组而不是单个值。因此,我们需要number.astype(int)
代替int(number)
。
或者,我们可以返回一系列格式化的字符串。 set_xticklabels
实际上需要一系列字符串:
def scale_xaxis(numbers):
return ['{:0.0f}'.format(item + 1001) for item in numbers]
使用自定义刻度格式化程序在这里是过度的,所以我暂时将其删除。不过,这在适当的情况下非常方便。