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()
我正在尝试以一种非常具体的方式格式化 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()