【问题标题】:Custom ticks autoscaled when using imshow?使用 imshow 时自定义刻度自动缩放?
【发布时间】:2012-11-16 01:17:36
【问题描述】:

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

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

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

    如果你确实想对我动手,你最好设置axisformatterlocator 以获得你想要的(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))
    

    需要设置定位器以确保刻度不会放在非整数位置,然后格式化程序会强制将它们转换为整数(这会将它们留在错误的位置)

    相关问题:

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

    removing leading 0 from matplotlib tick label formatting

    【讨论】:

    • 这适用于特定问题,并回答了我提出的问题(回想起来,我发现我的问题表述得很糟糕)。但它并没有真正解决我遇到的主要问题:我需要一些方法来让 matplotlib 选择合适的刻度数。例如,如果 return(number+1001) 是 return(number+10001)。然后我怎样才能让 matplotlib 自动选择正确的刻度数以避免重叠?我应该接受答案并提出一个新问题,还是应该编辑这个问题?
    【解决方案2】:

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

    你可以:

    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-03-12
      • 1970-01-01
      • 2016-09-04
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多