如何在Matplotlib中更改坐标轴标签的格式

10

如果我绘制一个对数坐标的图形,matplotlib会给我漂亮的实体105,106等。

但为了可读性,我更喜欢1e5、1e6等形式。

我能直接设置轴属性来实现这种方式吗?

一个比较丑陋的Hack方法是:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1, 40, 100);
y = np.linspace(1, 5, 100);

# Actually plot the exponential values
plt.plot(x, 10**y)
ax = plt.gca()
ax.set_yscale('log')

# Rewrite the y labels
y_labels = ax.get_yticks()
ax.set_yticklabels(['1e%i' % np.round(np.log(y)/np.log(10)) for y in y_labels])

plt.show()

在此输入图片描述

但肯定有更好的方法。


可能可以使用tickerFormatStrFormatter来实现。 - tmdavison
1个回答

19

您使用 ticker.FormatStrFormatter('%0.0e')。这将使用字符串格式%0.0e对每个数字进行格式化,该格式表示使用指数符号的浮点数:

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

x = np.linspace(1, 40, 100)
y = np.linspace(1, 5, 100)

# Actually plot the exponential values
fig, ax = plt.subplots()
ax.plot(x, 10**y)
ax.set_yscale('log')

# Rewrite the y labels
y_labels = ax.get_yticks()
ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%0.0e'))

plt.show()
产生

1
太棒了,正是我想要的。你不会知道一种将 1e+04 格式化为 1e4 的方法吗? - magu_
不幸的是,要控制它,您需要编写一个自定义函数。如果您确实想走这条路,请注意,您可以使用ticker.FuncFormatter。 - unutbu
嗯,是的,这就是我想的。但无论如何,还是谢谢你的帮助。 - magu_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接