在Python中创建柱状图

4 投票
1 回答
13568 浏览
提问于 2025-04-17 04:52

我在用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)

还有以下几点说明:

  1. 这段代码会调整你图像的大小,在这个例子中,它会把底部放大,以便能够容纳你的标签。通常情况下,你大致知道要放入的数据,所以这样就足够了。如果你使用的是 matplotlib 1.1 或更高版本,可以使用 tight_layout 函数来自动处理这个问题。另一种方法是根据所有坐标轴标签的边界框自己计算所需的大小,具体可以参考 这里,但你需要一个渲染器来确定所有标签的大小。
  2. 通过指定标签格式(使用 sciplain),你可以改变数值的显示方式。使用 plain 时,它会直接显示原始数值。想了解更多信息,可以查看 这个文档。注意,你还可以使用 set_yticklabels 函数的 text 参数来进一步控制格式(当然,这个函数在 x 轴上也可以使用)。

撰写回答