使用imshow时自定义滴答自动缩放?

时间:2012-11-16 01:17:36

标签: python matplotlib

我正在尝试使用以下代码更改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还是其他方式?

2 个答案:

答案 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

removing leading 0 from matplotlib tick label formatting

答案 1 :(得分:2)

有几种方法可以做到这一点。

你可以:

  1. 传入一组int而​​不是一组浮点数
  2. 传入格式化字符串数组
  3. 使用自定义刻度格式化程序
  4. 最后一个选项对于这么简单的事情来说太过分了。

    作为第一个选项的示例,您可以将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]
    

    使用自定义刻度格式化程序在这里是过度的,所以我暂时将其删除。不过,这在适当的情况下非常方便。