2014-10-10 177 views
7

我有一个基于简单数字列表的折线图。默认情况下,对于绘制的每个值,x轴只是1的增量。我想成为一个百分比,但不知道如何。因此,而不是具有x轴从0到5,它会去从0%到100%(但保持合理间距刻度线。代码如下,谢谢!Pyplot:在x轴上使用百分比

from matplotlib import pyplot as plt 
from mpl_toolkits.axes_grid.axislines import Subplot 

data=[8,12,15,17,18,18.5] 
fig=plt.figure(1,(7,4)) 
ax=Subplot(fig,111) 
fig.add_subplot(ax) 
plt.plot(data) 

回答

18

下面的代码会给你一个简单的x轴是以百分比为基础的,它假设每个值都是0%到100%之间的空格。

它创建一个perc数组,其中包含可用于绘制的均匀间隔百分比。调整x轴的格式,使其包含一个使用matplotlib.ticker.FormatStrFormatter的百分比符号。不幸的是,这使用旧式字符串格式,而不是新的样式,可以找到旧式样文档here

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

data = [8,12,15,17,18,18.5] 
perc = np.linspace(0,100,len(data)) 

fig = plt.figure(1, (7,4)) 
ax = fig.add_subplot(1,1,1) 

ax.plot(perc, data) 

fmt = '%.0f%%' # Format you want the ticks, e.g. '40%' 
xticks = mtick.FormatStrFormatter(fmt) 
ax.xaxis.set_major_formatter(xticks) 

plt.show() 

Example plot

+0

旧格式的样式没有错。它仍然是两者之间的更多互操作性(例如,参见记录模块)。 – 2016-03-29 19:37:50

+0

如果原始值已经是0.5,那么格式是什么?我想把它变成50%。 – 2016-09-08 11:17:35

+1

另一个可能的解决方案是使用'mtick.FuncFormatter(“{:。0%}”.format)',它使用新的样式格式化字符串,我发现它更具可读性和灵活性。 – 2017-09-19 03:28:36

2

这几月中下旬,但我已经创建PR#6251与matplotlib添加新的PercentFormatter类。通过这个类你可以做如下设置坐标轴:

import matplotlib.ticker as mtick 

# Actual plotting code omitted 

ax.xaxis.set_major_formatter(mtick.PercentFormatter(5.0)) 

这将显示从0到5的值,范围从0%到100%。格式化程序的概念与@Ffisegydd建议的相似,只是它可以考虑任何现有的刻度。

PercentFormatter()接受三个参数max,decimalssymbolmax允许您设置轴上100%对应的值(在您的示例中为5)。

其他两个参数允许您设置小数点后的位数和符号。它们分别默认为None'%'decimals=None将根据您显示的轴的数量自动设置小数点的数量。

请注意,如果您刚绘制数据,此格式化程序将使用通常会生成的任何刻度。它不会修改除输出到刻度标记的字符串以外的任何内容。