python - 来自 x 和 y 数据的密度分布和条形图
问题描述
我在熊猫数据框中有以下数据集:
x = df_data.iloc[:,0].values
y = df_data.iloc[:,1].values
以下数据分别位于 x 和 y 中:
x = 30, 31, 32, 33, 34, 35, 36
y = 1000, 2000, 3000, 4000, 3000, 2000, 1000
y 表示计数(每个 x 值存在的频率)。
我现在想用密度分布线制作条形图。我愿意使用 seaborn 或 matplotlib,但找不到分别输入 x 和 y 数据并获得条形图和密度图的方法。
我试过这个:
x = [30,31,32,33,34,35,36]
y = [1000, 2000, 3000, 4000, 3000, 2000, 1000]
##
sns.distplot(x, hist=True, kde=True,
bins=int(150/150), color='darkblue',
hist_kws={'edgecolor':'black'},
kde_kws={'linewidth': 4})
plt.show()
但没有得到我想要的。
我想要下面的东西(仅用于我的数据)
(我从:https ://towardsdatascience.com/histograms-and-density-plots-in-python-f6bda88f5ac0 得到这张图片)
解决方案
首先,请注意distplot
在 Seaborn 0.11 中已贬值。扩展和改进版本现在称为histplot
(带有可选 kde 的直方图)、kdeplot
(仅用于 kde)和displot
(创建子图)。
可选weights=
参数设置每个x
值的权重。discrete=True
需要为每个x
值设置一个条形图。kde的cut
参数控制曲线在数据点之外绘制的距离。
import matplotlib.pyplot as plt
import seaborn as sns
x = [30, 31, 32, 33, 34, 35, 36]
y = [1000, 2000, 3000, 4000, 3000, 2000, 1000]
sns.histplot(x=x, weights=y, discrete=True,
color='darkblue', edgecolor='black',
kde=True, kde_kws={'cut': 2}, line_kws={'linewidth': 4})
plt.show()
请注意,如果基础数据是连续的,则通过提供原始数据可以获得更正确的图。
要更改 kde 行的颜色,一个明显的想法是使用line_kws={'color': 'red'}
,但这在当前的 seaborn 版本(0.11.1)中不起作用。
但是,您可以单独绘制一个histplot
和kdeplot
。为了有匹配的 y 轴,histplot
需要stat='density'
(默认为'count'
)。
ax = sns.histplot(x=x, weights=y, discrete=True, alpha=0.5,
color='darkblue', edgecolor='black', stat='density')
sns.kdeplot(x=x, weights=y, color='crimson', cut=2, linewidth=4, ax=ax)
另一种方法是之后更改线条的颜色,它独立于所选的stat=
.
ax = sns.histplot(x=x, weights=y, discrete=True,
color='darkblue', edgecolor='black',
kde=True, kde_kws={'cut': 2}, line_kws={'linewidth': 4})
ax.lines[0].set_color('crimson')
下面是一个示例,如何将一个数据集的直方图与另一个数据集的 kde 曲线相结合:
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
import seaborn as sns
x = [30, 31, 32, 33, 34, 35, 36]
y = [1000, 2000, 3000, 4000, 3000, 2000, 1000]
x2 = [20, 21, 22, 23, 24, 25, 26]
y2 = [1000, 2000, 3000, 4000, 3000, 2000, 1000]
ax = sns.histplot(x=x2, weights=y2, discrete=True, alpha=0.5,
color='darkblue', edgecolor='black', stat='density')
sns.kdeplot(x=x, weights=y, color='crimson', cut=2, linewidth=4, ax=ax)
ax.xaxis.set_major_locator(MultipleLocator(1))
plt.show()
推荐阅读
- python - 如何调整窗口大小以填充全屏高度但指定屏幕宽度?
- php - 如何通过选择课程 ID 来选择特定课程并将用户所有选定的课程与同一行连接起来
- javascript - 如何访问自定义控件的变量
- android - google-map 片段应用程序在模拟器中崩溃后打开 WebView 活动
- c++ - 最后需要一个棘手的 while 循环的 C++ 赋值
- powershell - 显示名称包含在数组中的项目
- javascript - 发布嵌套对象会破坏 NodeJS 后端中的编码
- python - 如何使用 python 和 Opencv 或 PIL 去除文本周围的边缘
- java - 如何在wildfly中获取infinispan缓存统计信息?
- javascript - 在Javascript中链接可变数量的过滤器函数