matplotlib 中的特定轴格式

Specific axis formatting in matplotlib

我正在尝试以一种非常具体的方式格式化 matplotlib 图上的轴标签。我的代码如下:

import matplotlib.pyplot as plt

some_matrix = ...
alpha_values = list(np.power([2.0]*20, xrange(-12,8)))
gamma_values = list(np.power([2.0]*20, xrange(-12,8)))

plotted_matrix = plt.matshow(some_matrix)
plt.colorbar()
xtick_marks = np.arange(len(alpha_values))
ytick_marks = np.arange(len(gamma_values))
plt.xticks(xtick_marks,alpha_values)
plt.yticks(ytick_marks,gamma_values)
plt.xlabel('Alpha values',size='small')
plt.ylabel('Gamma values',size='small')

如您所见,我的 x(alpha's)和 y(gamma's)标签都是 2 的幂。我想知道是否可以将轴显示为 2 的幂,即标签为 2^-1、2^1、2^2,...(如果可能,将幂作为正确的上标)。

我试着写下:

y_formatter = plt.ticker.ScalarFormatter('#**2')
plotted_matrix.yaxis.set_major_formatter(y_formatter)

但我收到错误消息 'AxesImage' object has no attribute 'yaxis'

我从另一个来源获得了答案,其中包括单独定义权力的顺序:

import matplotlib.pyplot as plt

some_matrix = ...
alpha_values = list(np.power([2.0]*20, xrange(-12,8)))
gamma_values = list(np.power([2.0]*20, xrange(-12,8)))

plotted_matrix = plt.matshow(some_matrix)
plt.colorbar()
alpha_powers = list(xrange(-12,8))
gamma_powers = list(xrange(-12,8))
xtick_marks = np.arange(len(alpha_values))
ytick_marks = np.arange(len(gamma_values))
xtick_format = ['2^{{{0}}}'.format(i) for i in alpha_powers]
ytick_format = ['2^{{{0}}}'.format(i) for i in gamma_powers]
plt.xticks(xtick_marks, xtick_format)
plt.yticks(ytick_marks, ytick_format)
plt.xlabel('$Alpha values$', size='small')
plt.ylabel('$Gamma values$', size='small')

结果如下:

您可以使用 ticker.FuncFormatter 来定义刻度标签,并使用 ticker.MultipleLocator 来放置它们。

您收到的错误是因为您试图在 matshow 返回的 AxesImage 上设置刻度格式化程序,而不是 Axes 实例。这里我们可以使用matplotlib面向对象的方法来简化事情。

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np

alpha_values = list(np.power([2.0]*20, xrange(-12,8)))
gamma_values = list(np.power([2.0]*20, xrange(-12,8)))

some_matrix = np.random.rand(len(alpha_values),len(gamma_values))

fig,ax = plt.subplots()

plotted_matrix = ax.matshow(some_matrix)
fig.colorbar(plotted_matrix)

def tick_format(x,pos):
    # Map range 0-20 to 2^-12 to 2^8
    return "^{{ {:.0f} }}$".format(x-12)

ax.xaxis.set_major_locator(ticker.MultipleLocator(2))
ax.xaxis.set_major_formatter(ticker.FuncFormatter(tick_format))
ax.yaxis.set_major_locator(ticker.MultipleLocator(1))
ax.yaxis.set_major_formatter(ticker.FuncFormatter(tick_format))

ax.set_xlabel('Alpha values',size='small')
ax.set_ylabel('Gamma values',size='small')

plt.show()