在Python中创建柱状图
我在用Python创建柱状图时遇到了一些问题。我的图表代码是这样的:
import matplotlib
matplotlib.use('Agg')
from pylab import *
import calendar
def webshow(img):
savefig(img,dpi=500)
print 'Content-Type: text/html\n'
print '<img width="800" height="400" src="'+img+'" />'
genres = []
n = 0
for c in sorted_list:
genres.append(sorted_list[n][0])
n += 1
grosses = []
a = 0
for c in sorted_list:
grosses.append(sorted_list[a][1])
a += 1
clf()
bar(arange(len(grosses)),grosses)
xticks( arange(len(genres)),genres, rotation=80)
webshow("barchart.png")
我的图表看起来是这样的:
(来源: tumblr.com)
基本上,我主要的问题是数值显示成了小数,并且用了科学计数法。我希望能把它们以百万为单位来展示。另外,我不太确定怎么才能让底部的类别名称不被截断。谢谢大家的帮助!
1 个回答
4
首先,我会使用一个 figure
对象来进行操作:这样可以更方便地根据自己的喜好来构建图表。要构建你的图形,下面的代码应该可以满足你的需求:
fig = plt.figure()
fig.subplots_adjust(bottom=0.2) # Remark 1
ax = fig.add_subplot(111)
ax.bar(arange(len(grosses)), grosses)
ax.ticklabel_format(style='plain') # Remark 2
ax.set_xticks(arange(len(genres)))
ax.set_xticklabels(genres, rotation=80)
savefig('barchart.png', dpi=500)
还有以下几点说明:
- 这段代码会调整你图像的大小,在这个例子中,它会把底部放大,以便能够容纳你的标签。通常情况下,你大致知道要放入的数据,所以这样就足够了。如果你使用的是 matplotlib 1.1 或更高版本,可以使用
tight_layout
函数来自动处理这个问题。另一种方法是根据所有坐标轴标签的边界框自己计算所需的大小,具体可以参考 这里,但你需要一个渲染器来确定所有标签的大小。 - 通过指定标签格式(使用
sci
或plain
),你可以改变数值的显示方式。使用plain
时,它会直接显示原始数值。想了解更多信息,可以查看 这个文档。注意,你还可以使用set_yticklabels
函数的text
参数来进一步控制格式(当然,这个函数在 x 轴上也可以使用)。