2013-05-13 66 views
1

我想在频率上产生一些图。我想要有一个带有上标符号的x轴,如here。 此外,我需要垂直注释单独千赫和兆赫兹的垂直线。matplotlib带上标的剔号轴

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但无法弄清楚如何设置它。我试图按照some的例子,但有错误,如AttributeError: 'Figure' object has no attribute 'ticklabel_format' 已经花了相当多的时间,并不知道如何前进。

一般来说,我需要x轴以类似的方式格式化,比如果plt.xscale('log')但我想保持线性缩放。

+0

你能告诉使用_doesn't_工作的代码? – tacaswell 2013-05-13 18:53:37

+1

另外,使用'axvline'而不是'vlines'作为垂直线。 – tacaswell 2013-05-13 18:54:41

+0

我试着用不同配置的'matplotlib.ticker.Formatter',并且我尝试了很多不再存在的行。同样对于'set_major_formatter',我得到像'object has no attribute'这样的错误 – tomasz74 2013-05-13 19:01:47

回答

3

您可以定义勾号标记为字符串并将其分配:

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() 
+0

谢谢。我非常喜欢你的解决方案。它给我所需要的。我虽然可以做matplotlib级别的某种格式,但这也很好。 – tomasz74 2013-05-13 21:06:31