2015-09-06 136 views
1

我是Python編程新手。我正在學習Python。在python中繪製條形圖

下面的代碼幫我畫了一張條形圖。我想了解代碼。 我看不慣線5,6,7和8即

N = len(data) 
x = np.arange(1,N+1) 
y = [num for (s, num) in data ] 
labels = [ s for (s, num) in data ] 

而且,我們爲什麼要採取x+width/2.0,同時繪製x軸的標籤? 而且,如何在房子盜竊之前在圖表的開始處添加一個小寬度?酒吧通常以0開頭。我不知道如何在第一個酒吧開始前帶上一個小寬度。我試過了,但沒有好轉。

完整的程序如下。

import matplotlib.pyplot as plt 
import numpy as np 
data = [ ("House Theft", 57), ("House Fire", 48), 
      ("Car Theft", 156), ("Car Accident", 245)] 
N = len(data) 
x = np.arange(1,N+1) 
y = [num for (s, num) in data ] 
labels = [ s for (s, num) in data ] 
width = 0.35 #Use 1 to make it as a histogram 
bar1 = plt.bar(x, y, width, color="y") 
plt.ylabel('Frequency') 
plt.xticks(x + width/2.0, labels) 
plt.show() 
+0

'''data'''是一個列表 - ['''len'''](https://docs.python.org/3/library/functions.html#len)。 [''numpy'''](http://docs.scipy.org/doc/numpy/user/)('''np''')是一個庫 - ['''np.arange''' ](http://docs.scipy.org/doc/numpy-1.6.0/reference/generated/numpy.arange.html)。第7行和第8行是[list comprehensions](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions)。 – wwii

+0

@wwii這行'num(s,num)in data'表示什麼?我瞭解數據是範圍。這些變量和數字表明什麼?與字符串和數字有關?他們究竟想要在這裏做什麼? –

+0

['''tuple''' unpacking](https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences)。解釋型語言的一個好處是,您可以輕鬆地使用shell中的語言功能來嘗試一些東西,看看它是如何工作的。 Python有一個相當不錯的[教程](https://docs.python.org/3/tutorial/index.html)。 – wwii

回答

1

Multiple assignment, tuple/sequence packing/unpacking

>>> 
>>> data = [ ("House Theft", 57), ("House Fire", 48), 
      ("Car Theft", 156), ("Car Accident", 245)] 
>>> 
>>> for thing in data: 
    (s, num) = thing 
    print thing, '\t', s, '\t', num 

('House Theft', 57)  House Theft  57 
('House Fire', 48)  House Fire  48 
('Car Theft', 156)  Car Theft  156 
('Car Accident', 245) Car Accident 245 
>>> 

>>> for (s, num) in data: 
    print s, '\t\t', num 


House Theft   57 
House Fire   48 
Car Theft   156 
Car Accident  245 
>>> 

plt.xticks(x + width/2.0, labels)將由上的寬度的一半的偏移在x軸上的刻度。不知道爲什麼這樣做,除了可能的視覺效果。

>>> x = np.arange(1,11) 
>>> x 
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 
>>> width = .5 
>>> x + width/2 
array([ 1.25, 2.25, 3.25, 4.25, 5.25, 6.25, 7.25, 8.25, 9.25, 10.25]) 
>>> 
+1

我現在試過了。它幫助我很清楚地理解它。這種語言非常好。我曾在C,C++和Java中工作。相比之下,這裏的一切都更簡單。非常感謝! –

0
  • N = len(data)

N的值現在是在陣列data的長度。在你的情況下,data的長度是4

  • x = np.arange(1,N+1)

x的值現在是[1, 2, 3, 4],看到從doc這個例子:

>>> np.arange(3) 
array([0, 1, 2]) 
>>> np.arange(3.0) 
array([ 0., 1., 2.]) 
>>> np.arange(3,7) 
array([3, 4, 5, 6]) 
>>> np.arange(3,7,2) 
array([3, 5]) 
  • y = [num for (s, num) in data ]

y的值是[57, 48, 156, 245]

for (s, num) in data重複data的值。 由於data的值有兩個部分("House Theft", 57),對於每個循環,s取第一部分(第一個循環的"House Theft")的值和第二個部分的值(第一個循環的57)。既然你只需要數字(第二部分),num for (s, num) in data只需要num,然後你的數組被填充,因爲表達式在括號內[]之間。

它從表達式num for (s, num) in data的「結果」中創建一個數組。

  • labels = [ s for (s, num) in data ]

和以前一樣,但與字符串,而不是價值。

我仍然對命名法(數組,元組,列表...)有困惑,如果有人可以檢查我的答案,我會很感激它,因爲它會幫助作者和我學習正確的Python詞彙表!

+0

非常感謝您的清楚解釋。 –