【问题标题】:How to plot a very simple bar chart (Python, Matplotlib) using input *.txt file?如何使用输入 *.txt 文件绘制一个非常简单的条形图(Python、Matplotlib)?
【发布时间】:2012-07-21 23:52:55
【问题描述】:

我使用 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 文档,但它仍然对我没有帮助。我还想将我阅读的日期添加到我的条形图中,使其看起来像

有人可以帮帮我吗?

【问题讨论】:

    标签: python matplotlib bar-chart


    【解决方案1】:

    此代码将满足您的需求。它基于找到的示例 herehere

    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")
    

    【讨论】:

    • 'width=0.75' 效果更好。将 xticks 放在条的中间
    • ind = np.arange(len(OY)) NameError: name 'OY' is not defined
    【解决方案2】:

    您说的是直方图,但这不太合理。直方图和条形图是不同的东西。例如,直方图是表示每年值总和的条形图。在这里,您似乎只是在追求酒吧。

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

    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 轴设置为使用日期(如this answer 中所述)。

    如果您不想让 x 轴显示线性时间刻度,而只是想要带有标签的条形图,则可以改为:

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

    编辑:在 cmets 之后,对于所有刻度,并使其居中,将范围传递给 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)
    

    【讨论】:

    【解决方案3】:

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

    要使用 matplotlib 制作条形图,请使用 matplotlib.pyplot.bar() 方法。请查看 matplotlib 文档的 this page,该文档通过示例很好地解释了,source code 如何做到这一点。

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

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

    【讨论】:

    • 感谢您的回答,但我必须在 Python 中完成。
    • 这不是重新发明轮子,而是使用不同的工具。使用您的论点,学习如何在 matplotlib 中绘制折线图毫无意义,因为您可以在 Excel 中完成
    • "如果你能避免编写代码会更好。"为什么?我无法想象 SO 上有很多人会同情这种说法。
    • 我不知道为什么这个答案有这么多反对意见。好吧,答案似乎是在很久以后才编辑的。
    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2019-04-27
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2019-01-31
    相关资源
    最近更新 更多