微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Matplotlib 时 Jupyter 笔记本中的条形图绘图和显示问题

如何解决使用 Matplotlib 时 Jupyter 笔记本中的条形图绘图和显示问题

我正在尝试绘制从我的 AWS S3 存储桶中的 csv 文件加载到 Jupyter notebook 的数据的频率分布。

%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
bucket = "a_bucket"
data_key = "ice_freq.csv"
data = f's3://{bucket}/{data_key}'
load = pd.DataFrame(pd.read_csv(data))
load

数据框显示正常,所有数据均按预期加载。有 373909 行数据,只有一列 Data 包含从 -7.80 到 4.5 下雨的浮点数。

然后我使用以下内容来计算每个浮点数的出现次数并将它们绘制到条形图上。

fig,ax = plt.subplots()
r = load['Data'].value_counts()
r.plot(ax=ax,kind ='bar')

(请注意,如果单独运行,则该值很重要,看起来像这样 (Value counts output)

但是我得到的条形图可以在以下链接中看到。 Faulty Bar Chart 并且显然没有正确显示(所有的 x 值看起来都因为某种原因被编辑了)。它也不是数据的正确分布。

这很奇怪,因为如果我在代码中将 'bar' 编辑为 'line',我会得到一个折线图 (Line Chart),我知道它是数据的完美分布。因此,我可以使用“折线”图查看数据的分布。为什么 matplotlib 不能绘制条形图。

解决方法

有点不清楚您的数据究竟是什么样子。为了使 value_counts() 有意义,这些值不应该是随机浮点数,而应该是有限的集合,例如四舍五入到 1 或 2 位小数。

Pandas 的条形图是“分类的”,并为系列 r 中的每一行创建一个条形。索引(用于 x 轴)是值,高度是它的计数。顺序是从最频繁到不太频繁。您可以使用 .sort_index() 对索引进行排序。

Pandas 的线图使用数字 x 轴。但也使用给定的索引顺序来决定如何连接值。因此,对于线图,.sort_index() 将有助于创建更传统的曲线。

这是一个从虚拟数据开始的例子:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

load = pd.DataFrame({'Data': np.random.normal(0,1,10000).round(1)})
r = load['Data'].value_counts().sort_index()
r.plot(kind='bar')
plt.show()

bar plot from sorted index

对于数字 x 轴,您可以从原始数据开始使用 seaborn 的 histplot(可选择使用 kde=True 以平滑近似概率分布):

import seaborn as sns

sns.histplot(x=load['Data'],bins=30,kde=True)

请注意,当您的数据是离散的,并且您需要大量 bin 时,您应该省略 bins= 并将 binwidth= 设置为连续值之间距离的某个小倍数。例如。 sns.histplot(x=load['Data'],binwidth=0.2)。这是为了避免交替的 bin 比它们的邻居多计数一个值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。