python中的着色图条基于2d数组值和字典

时间:2017-10-26 17:56:09

标签: python arrays numpy matplotlib

我正在努力学习数据可视化,而我居住的城市实际上已经在市议会的存在上传了一些opendata。
我想为每个理事会成员显示一个栏,根据党员身份对其进行着色并发布 我有一个文件,每行都有一个 - "名称"," Party","收到的总代币€"。
我将每列分成不同的变量,然后尝试

import matplotlib.pyplot as plt
import numpy as np
import csv

with open('Book1.csv', 'r') as csvfile:
     readCSV  = csv.reader(csvfile, delimiter=',')
    names = []
    parties = []
   tots = []
   for row in readCSV:
       name = row[0]
       party = row[1]
       tot = row[2]

       names.append(name)
       parties.append(party)
       tots.append(tot)

tots = list(map(int,tots))
np_names = np.array(names)
np_parties = np.array(parties)
np_tots = np.array(tots)


 N = len(np_tots)
 x = range(N)
 width = 1/1.5

 col = {
    'PD' : 'red',
    'PDL' : 'blue',
    'Democrazia e Solidarieta' : 'pink',
    'UDC' : 'white',
    'Gruppo Misto' : 'gray',
    'Insieme per Pavia' : 'yellow',
    'Rinnovare Pavia' : 'green',
    }

 np_fin = np.column_stack((np_tots,np_parties))
 print(np_fin)
 plt.bar(x, np_fin[:,0], width, color= col.get(np_fin[:,0])
 plt.show()

我丢失了整数,因为它们在新的2d数组中被转换回字符串,并且无法访问颜色编码的字典。

编辑:示例.csv

FRANCESCO,PD,0  
BRUNO,PDL,185   
MATTEO,Lega Nord,463

1 个答案:

答案 0 :(得分:0)

你似乎过于复杂了一些事情(在Python中,你的代码越简单越好)。

首先,您不需要将列表转换为数组。其次,将白色设置为条形图的颜色意味着不会显示任何内容。我已将UDC的颜色重命名为紫色。

csv文件示例包含" Lega Nord"它没有出现在字典col中。我还将其中一个值从0增加到50,这样我们就可以看到实际的条形图。因此我使用的csv文件看起来像:

FRANCESCO,PD,50
BRUNO,PDL,185
MATTEO,UDC,463

对于条形图的颜色,您需要创建一个可以传递给plt.bar的颜色列表。您可以通过col[key]访问字典中的值(在您的情况下为颜色),其中key将是列表parties的内容。因此,我们需要一个循环或列表理解,就像我在下面的例子中所使用的那样。

然后,您只需使用plt.bar(x, tots, color=cols)绘制条形图。为了标记x轴,您只需要绘制条形所在的刻度,然后添加这些刻度所在的标签。这可以使用plt.xticks(x, names)完成。

您的代码变为:

import matplotlib.pyplot as plt
import csv

col = {
    'PD' : 'red',
    'PDL' : 'blue',
    'Democrazia e Solidarieta' : 'pink',
    'UDC' : 'purple',
    'Gruppo Misto' : 'gray',
    'Insieme per Pavia' : 'yellow',
    'Rinnovare Pavia' : 'green',
    }

with open('Book1.csv', 'r') as csvfile:
    readCSV  = csv.reader(csvfile, delimiter=',')
    names = []
    parties = []
    tots = []
    for row in readCSV:
        names.append(row[0])
        parties.append(row[1])
        tots.append(row[2]) 

N = len(tots)
x = range(N)

# create a list of colours from the dictionary if it appears in the list parties
cols = [col[key] for key in parties]  

plt.bar(x, tots, color=cols)
plt.xticks(x, names)   # set the x ticks at the position of the bars and set the label

plt.show()

产生下图:

enter image description here