在python中绘制条形图

时间:2015-09-06 15:16:15

标签: python numpy matplotlib

我是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轴标签时采用x+width/2.0? 而且,如何在House Theft之前在图表的开头带一个小宽度?条形通常从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()

2 个答案:

答案 0 :(得分: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 :(得分: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")和num第二部分的值(第一个循环的57)。由于您只需要数字(第二部分),num for (s, num) in data只接受num,然后您的数组会被填充,因为表达式位于括号[]之间。

它从"结果"创建一个数组。表达式num for (s, num) in data

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

与之前相同,但使用字符串而不是值。

我仍然对术语(数组,元组,列表......)感到困惑,如果有人可以查看我的答案,我会感激它,因为它可以帮助作者和我学习正确的Python词汇!