Matplotlib刻度轴表示法中的上标

3
我希望能够绘制一些关于频率的图表。我想要一个带有上标符号的x轴,就像这里所示。 此外,我需要在千赫和兆赫之间使用垂直线和垂直注释进行分隔。
import numpy as np
import matplotlib.pyplot as plt
band = np.linspace(0,10**12,100)
y = band

plt.plot(band,y)
plt.xlabel('Frequencies')

plt.vlines(10**3, min(y), max(y),colors = 'black', label = 'kilo Hz')
plt.vlines(10**6, min(y), max(y),colors = 'black', label = 'mega Hz')
plt.legend()
plt.show()

我尝试使用 ticker,但不知道如何设置。我尝试按照一些示例操作,但出现错误,例如AttributeError:'Figure'对象没有'ticklabel_format'属性。我已经花了很多时间在这上面,不知道该怎么继续。

总的来说,我需要x轴以类似于plt.xscale('log')的方式格式化,但我想保持线性刻度。


你能展示一下那段不起作用的代码吗? - tacaswell
1
请使用 axvline 替代 vlines 来绘制您的垂直线。 - tacaswell
我尝试使用不同的配置来使用matplotlib.ticker.Formatter,并且我尝试了很多已经不存在的行。对于set_major_formatter,我会收到类似object has no attribute的错误。 - tomasz74
1
只是一个想法;如果你的x轴跨越值(至少)从103到106,使用线性比例尺,那么105和106之间的距离将是104和105之间距离的10倍,以及103和104之间距离的100倍(!!)。在你链接的示例中,x轴实际上是对数比例尺。 - sodd
但是你尝试在哪些对象上使用 set_major_formatter?这是 axis 对象的方法(而不是 axes)。例如:yaxis = ax.get_yaxis() - tacaswell
2个回答

5
您可以将刻度标记定义为字符串并进行分配:
mport numpy as np
import matplotlib.pyplot as plt
band = np.linspace(0,10**12,100)
y = band

plt.plot(band,y)
plt.xlabel("Frequencies")

plt.vlines(10**3, min(y), max(y),colors = 'black', label = 'kilo Hz')
plt.vlines(10**6, min(y), max(y),colors = 'black', label = 'mega Hz')

string_labels = []
for i in range(0,len(y),10):
    string_labels.append(r"$10^{%02d}$" % (i/10.0))

plt.xticks(np.linspace(0,10**12,10),string_labels)

plt.legend()
plt.show()

谢谢。我真的很喜欢你的解决方案。它提供了我所需要的东西。我认为这可以作为 matplotlib 级别的某种格式来完成,但这也不错。 - tomasz74

0

谢谢,不幸的是我目前看来没有解决我的问题的方案。 - tomasz74

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