我正在努力学习数据可视化,而我居住的城市实际上已经在市议会的存在上传了一些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
答案 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()
产生下图: