2012-07-23 83 views
24

我使用Python 2.7和matplotlib。我有* .TXT數據文件:如何使用輸入* .txt文件繪製一個非常簡單的條形圖(Python,Matplotlib)?

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文檔,但它仍然沒有幫助我。我也想加入紅棗我讀我的條形圖,以使它看起來像

this

有人能幫助我嗎?

回答

29

你在談論的直方圖,但這並不完全意義。直方圖和條形圖是不同的東西。例如,直方圖可以是表示每年的值總和的條形圖。在這裏,你似乎在酒吧之後。

這裏是你的數據完整的例子,它顯示出在每個時間每個所需值吧:

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) 

編輯:發表意見之後,對於所有的蜱,併爲他們爲中心,傳遞範圍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) 
+0

這很棒,但有沒有辦法在軸x上更垂直地設置標籤照片?軸x上的大量數據看起來不太好。但是,謝謝,我一定會用你的例子:) – mazix 2012-07-23 21:23:58

+0

改變旋轉角度。 – Bruno 2012-07-23 21:24:53

+0

謝謝:)還有一件事:如何在每個垃圾箱下方設置這些日期標籤?我嘗試了不同的旋轉角度,但它不夠好:http://s6.ifotos.pl/img/chartpng_raqrsaq.png – mazix 2012-07-24 20:33:12

4

首先,你要找的是條形圖,不是直方圖。直方圖由連續變量的頻率分佈構成,該連續變量被分爲多個分區。這裏有一個針對單獨標籤的列。

要用matplotlib製作條形圖,請使用matplotlib.pyplot.bar()方法。查看matplotlib文檔的this page,這些文檔很好地解釋了示例,source code如何執行。

如果可能的話,我只是建議對於這樣一個簡單的任務,如果你可以避免編寫更好的代碼。如果你有任何電子表格程序,這應該是一塊蛋糕,因爲這正是他們的目的,你不必'重新發明輪子'。以下是你的數據在Excel中的情節:

Bar diagram plot in Excel

我剛從問題複製您的數據,使用的文本導入嚮導把它放在兩列,然後我插入一列圖。

+2

謝謝您的回答,但我必須這樣做,在Python。 – mazix 2012-07-23 21:22:10

+7

這不是重新發明輪子,而是使用不同的工具。使用你的論點,學習如何在matplotlib中繪製線圖沒有任何意義,因爲你可以在Excel中使用 – Anake 2014-07-22 12:49:57

+2

「如果你可以避免編寫更好的代碼」。爲什麼?我無法想象很多人會對此表示同情。 – dbliss 2015-04-02 21:06:58

24

此代碼將做你正在尋找。它基於發現的例子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") 

enter image description here

+0

'寬度= 0.75'效果更好。將xticks放在條的中間 – dreme 2015-02-05 23:31:38

+2

'ind = np.arange(len(OY))NameError:名稱'OY'沒有定義' – manetsus 2016-04-05 16:13:44