如何创建27.000行的抖动图?

时间:2018-04-20 01:34:04

标签: python python-3.x matplotlib plot seaborn

我有一个包含27.000行的CSV文件。我正在尝试创建一个抖动图,就像这个[https://static1.squarespace.com/static/56fd706140261df95349d4bd/t/59297c72579fb3d813d591c1/1495891103667/Jitter+Example+The+Truthful+Art.png?format=1000w]一样。

enter image description here

' y' axis将是名为" VALOR_REEMBOLSADO"的列。 (代表"退款价值")。 ' x' axis将是名为" MES"的列。 (代表"月")。

它代表了2017年巴西参议员的支出.CSV文件非常有条理,但最初有" VALOR_REEMBOLSADO"作为字符串而不是浮点数。我取代了","对于"。",但我仍然无法绘制图表。

有人可以帮我处理代码吗?什么代码可以创建这样的图表?

在这里您可以找到2017年的CSV文件:https://www12.senado.leg.br/transparencia/dados-abertos-transparencia/dados-abertos-ceaps

1 个答案:

答案 0 :(得分:2)

起初我不得不承认我无法理解你问题的某些方面(第一个链接不起作用,更重要的是:你想要一个显示月份的x轴,但是在图中,数据,数据显示在州之上。

但我发现你的问题在读取数据的最初阶段已经开始了,所以我会尝试给你提供所需的提示:

为了阅读这样的csv数据,我建议pandas,通常用

导入
import pandas as pd

它包含一个csv阅读器,功能非常强大。一般来说,你应该避免手动调整你拥有的数据源(比如改变小数点等),因为这是read_csv等导入函数已经解决的问题(你不想这样做)将来会有新的数据文件,但同样的情节产生一次又一次):

filepath = 'wherever/file/may/roam/2017.csv'
data = pd.read_csv(filepath, skiprows=1, sep=';', usecols=[1, 9], decimal=',')

使用filepath告诉导入者您存储csv文件的位置,skiprows=1表示您对文件的第一行不感兴趣,sep定义了通过usecols列之间的分隔符,您只能选择感兴趣的列,“MES'和' VALOR_REEMBOLSADO'在你的例子中。 decimal指定数据中浮点数的小数点。

现在data包含数据的pandas数据框:

In: data[:10]
Out:
   MES  VALOR_REEMBOLSADO
0    1              97.00
1    1            6000.00
2    1             418.04
3    1            1958.95
4    1            1178.67
5    1            1252.65
6    2              62.30
7    2             240.81
8    2            6000.00
9    2            2062.25

所以这应该是你可以玩的东西。

如果您愿意,现在可以使用matplotlibseaborn来绘制此数据。 pandas本身也包含了一些绘图方法。

但是,正如我所指出的那样,你的问题与你添加的示例情节有所不同,所以从这一点来看,它有点难以准确地帮助你。

例如,您可以汇总所有相等的月份,以创建数月的情节。对于这些情况,Dataframes有groupby方法:

data.groupby('MES')

这只返回一个所谓的grouby-object,但你可以告诉它,你想对分组数据做些什么,例如:

In: data.groupby('MES').sum()
Out: 
     VALOR_REEMBOLSADO
MES                   
1           1558581.11
2           1951731.07
3           2225328.21
4           2248882.83
5           2256224.68
6           2216981.94
7           2053173.90
8           2372847.10
9           2161915.35
10          2355417.34
11          2294658.51
12          2938033.00

如果您对每个月内的金额感兴趣。 data.groupby('MES').mean()的平均值相同。对于第一个图,您可以添加类似

的绘图方法
data.groupby('MES').sum().plot()

产生

如果您想查看问题中图片中的分布和平均值(但仍然会在数月内绘制,而不是在州内绘制,因为我不会在您的文件中看到此信息)您可以拥有看看散点图:

import matplotlib.pyplot as plt
plt.figure()
plt.scatter(data['MES'],data['VALOR_REEMBOLSADO'])
plt.plot(data.groupby('MES').mean()['VALOR_REEMBOLSADO'], 'k_', ms=10)

产生

但是当你在标签列表中提到seaborn时:这个库提供了一个抖动图,就像你引用via stripplot一样。所以这最终是你问题的绘图部分的答案,导致这段代码:

import pandas as pd
import seaborn as sns
filepath = 'https://raw.githubusercontent.com/gabrielacaesar/studyingPython/master/ceap-sf-new-12-04-2018.csv'
data = pd.read_csv(filepath, usecols=[1,9], decimal=',')
x = data['MES'].values
y = data['VALOR_REEMBOLSADO'].values
sns.stripplot(x, y, jitter=True)

产生