8

我正在尝试imshow使用以下代码更改 x 轴上刻度的值:

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")

结果图像 http://ubuntuone.com/2Y5ujtlEkEnrlTcVUxvWLU

然而,x 刻度重叠并具有“非圆形”值。matplotlib 有什么方法可以自动执行此操作吗?通过使用set_ticklabels或其他方式?

4

2 回答 2

8

还可以考虑使用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])  

如果您确实想要我的手,您最好设置formatterandlocatoraxis 获得您想要的(doc)

import matplotlib.pyplot as plt
import numpy as np

def scale_xaxis(number):
    return(number+1001)

def my_form(x,pos):
    return '%d'%scale_xaxis(x)

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)
ax.xaxis.set_major_locator(matplotlib.ticker.MultipleLocator(int(2)))
ax.xaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(my_form))

The locator needs to be set to make sure that ticks don't get put at non-integer locations which are then forcible cast to integers by the formatter (which would leave them in the wrong place)

related questions:

matplotlib: format axis offset-values to whole numbers or specific number

removing leading 0 from matplotlib tick label formatting

于 2012-11-16T17:35:15.637 回答
3

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

你可以:

  1. 传入整数数组而不是浮点数数组
  2. 传入格式化字符串数组
  3. 使用自定义刻度格式化程序

对于这么简单的事情,最后一个选项是矫枉过正的。

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

在这里使用自定义刻度格式化程序是多余的,所以我暂时不考虑它。不过,在正确的情况下,它非常方便。

于 2012-11-16T17:31:43.663 回答