25

我使用 Python 2.7 和 matplotlib。我有一个 *.txt 数据文件:

0 14-11-2003
1 15-03-1999
12 04-12-2012
33 09-05-2007
44 16-08-1998
55 25-07-2001
76 31-12-2011
87 25-06-1993
118 16-02-1995
119 10-02-1981
145 03-05-2014

我的文件的第一列(数字)应该在我的条形图中的 Y 轴上,我的文件的第二列(日期)应该在我的直方图中的轴 OX 上。我只知道如何读取文件:

OX = []
OY = []

try :
    with open('data.txt', 'r') as openedFile :
        for line in openedFile :
            tab = line.split()
            OY.append(int(tab[0]))
            OX.append(str(tab[1]))
except IOError :
    print("IOError!")

我确实阅读了 matplotlib 文档,但它仍然对我没有帮助。我还想将我读到的日期添加到我的条形图中,让它看起来像

这个

有人可以帮我吗?

4

3 回答 3

30

你在谈论直方图,但这不太有意义。直方图和条形图是不同的东西。例如,直方图是表示每年值总和的条形图。在这里,您似乎只是在追求酒吧。

以下是您数据中的一个完整示例,该示例显示每个日期每个所需值的条形:

import pylab as pl
import datetime

data = """0 14-11-2003
1 15-03-1999
12 04-12-2012
33 09-05-2007
44 16-08-1998
55 25-07-2001
76 31-12-2011
87 25-06-1993
118 16-02-1995
119 10-02-1981
145 03-05-2014"""

values = []
dates = []

for line in data.split("\n"):
    x, y = line.split()
    values.append(int(x))
    dates.append(datetime.datetime.strptime(y, "%d-%m-%Y").date())

fig = pl.figure()
ax = pl.subplot(111)
ax.bar(dates, values, width=100)
ax.xaxis_date()

您需要解析日期strptime并将 x 轴设置为使用日期(如本答案中所述)。

如果您对让 x 轴显示线性时间刻度不感兴趣,而只是想要带有标签的条形图,则可以这样做:

fig = pl.figure()
ax = pl.subplot(111)
ax.bar(range(len(dates)), values)

编辑:在评论之后,对于所有的刻度,并让它们居中,将范围传递给set_ticks(并将它们移动一半的条宽):

fig = pl.figure()
ax = pl.subplot(111)
width=0.8
ax.bar(range(len(dates)), values, width=width)
ax.set_xticks(np.arange(len(dates)) + width/2)
ax.set_xticklabels(dates, rotation=90)
于 2012-07-23T18:34:13.187 回答
24

此代码将执行您要查找的操作。它基于此处此处找到的示例。

autofmt_xdate()调用对于使 x 轴标签可读特别有用。

import numpy as np
from matplotlib import pyplot as plt

fig = plt.figure()

width = .35
ind = np.arange(len(OY))
plt.bar(ind, OY, width=width)
plt.xticks(ind + width / 2, OX)

fig.autofmt_xdate()

plt.savefig("figure.pdf")

在此处输入图像描述

于 2012-07-23T18:28:02.673 回答
3

首先,您要查找的是柱形图条形图,而不是真正的直方图。直方图由连续变量的频率分布制成,该连续变量被分成多个 bin。在这里,您有一个针对单独标签的列。

要使用 matplotlib 制作条形图,请使用该matplotlib.pyplot.bar()方法。看看matplotlib 文档的这个页面,它通过示例和源代码很好地解释了如何做到这一点。

但是,如果可能的话,我只是建议对于像这样的简单任务,如果您可以避免编写更好的代码。如果您有任何电子表格程序,这应该是小菜一碟,因为这正是它们的用途,您不必“重新发明轮子”。以下是您在 Excel 中的数据图:

Excel中的条形图

我刚刚从问题中复制了您的数据,使用文本导入向导将其放在两列中,然后我插入了一个柱形图。

于 2012-07-23T18:11:56.563 回答