在一个图上叠加概率密度函数
Overlaying probability density functions on one plot
我想为来自三个 NOx 源的 N 的同位素测量创建一个概率密度函数。测量次数因来源而异,因此我创建了三个数据框。这是代码:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#import matplotlib.ticker as plticker
#from matplotlib.ticker import (MultipleLocator, AutoMinorLocator)
df = pd.DataFrame({
'Mobile':[15.6, 14.2, 14.4, 10.2, 13.1, 12.8, 13.3, 16.9, 15.8, 15.3, 16.9, 15.6, 15.6, 17, 16, 15.1, 15, 14.4,
14.6, 16.2, 15.3, 16.4, -0.4, -2.9, 1.6, 9.8, 1.6, -8.1, -4.4, -0.4, 8.6]})
df1 = pd.DataFrame({
'Soil':[-47, -37, -29, -26, -25, -24, -31, -23, -22, -19, -49, -42, -44, -37, -29, -29, -32, -31, -29, -28,
-26.5, -30.8]})
df2 = pd.DataFrame({
'Biomass Burning':[-2.7, -5, -5.9, -7.2, 3.2, 2.6, 3.8, 8.1, 12, 0.9, 1.3, 1.6, -1.5, -1.3, -0.1, 0.5, 4.4, 2,
2.9, 1.7, 3.2, 1.6, -0.3, -0.9]})
fig = plt.figure()
ax = fig.add_subplot()
ax.hist([df, df1, df2], label = ("Mobile", "Soil", "Biomass Burning"), bins=25, stacked=True, range=[0,25])
问题是我收到一条错误消息:ValueError: x must have 2 or fewer dimensions
。我尝试了一种“增肥”方法,但收到一条错误消息 AttributeError: 'DataFrame' object has no attribute 'flatten'
。我不确定接下来要尝试什么才能将代码获取到 运行 并且需要一些帮助。我还认为 hist
可能是使用错误的函数,因为我想要概率密度分布。我也试过:
sns.displot(data=[df,df1,df2], x=['Mobile','Soil','Biomass Burning'], hue='target', kind='kde',
fill=True, palette=sns.color_palette('bright')[:3], height=5, aspect=1.5)
但是,我 运行 再次关注数据帧长度不同的问题。谢谢!
一个选项是 melt
数据帧,concat
它们,然后使用 hue
和 displot
:
data = pd.concat([df.melt(), df1.melt(), df2.melt()], ignore_index=True)
sns.displot(data=data, x='value', hue='variable', kind='kde')
输出:
使用 melt
的 var_name
和 value_name
参数以获得比“变量”和“值”更有意义的标识符,例如
kws = {'var_name': 'Source', 'value_name': 'Measurements'}
data = pd.concat([df.melt(**kws), df1.melt(**kws), df2.melt(**kws)],
ignore_index=True)
sns.displot(
data=data, x='Measurements', hue='Source', kind='kde',
fill=True, palette=sns.color_palette('bright')[:3], height=5, aspect=1.5
)
输出:
我想为来自三个 NOx 源的 N 的同位素测量创建一个概率密度函数。测量次数因来源而异,因此我创建了三个数据框。这是代码:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#import matplotlib.ticker as plticker
#from matplotlib.ticker import (MultipleLocator, AutoMinorLocator)
df = pd.DataFrame({
'Mobile':[15.6, 14.2, 14.4, 10.2, 13.1, 12.8, 13.3, 16.9, 15.8, 15.3, 16.9, 15.6, 15.6, 17, 16, 15.1, 15, 14.4,
14.6, 16.2, 15.3, 16.4, -0.4, -2.9, 1.6, 9.8, 1.6, -8.1, -4.4, -0.4, 8.6]})
df1 = pd.DataFrame({
'Soil':[-47, -37, -29, -26, -25, -24, -31, -23, -22, -19, -49, -42, -44, -37, -29, -29, -32, -31, -29, -28,
-26.5, -30.8]})
df2 = pd.DataFrame({
'Biomass Burning':[-2.7, -5, -5.9, -7.2, 3.2, 2.6, 3.8, 8.1, 12, 0.9, 1.3, 1.6, -1.5, -1.3, -0.1, 0.5, 4.4, 2,
2.9, 1.7, 3.2, 1.6, -0.3, -0.9]})
fig = plt.figure()
ax = fig.add_subplot()
ax.hist([df, df1, df2], label = ("Mobile", "Soil", "Biomass Burning"), bins=25, stacked=True, range=[0,25])
问题是我收到一条错误消息:ValueError: x must have 2 or fewer dimensions
。我尝试了一种“增肥”方法,但收到一条错误消息 AttributeError: 'DataFrame' object has no attribute 'flatten'
。我不确定接下来要尝试什么才能将代码获取到 运行 并且需要一些帮助。我还认为 hist
可能是使用错误的函数,因为我想要概率密度分布。我也试过:
sns.displot(data=[df,df1,df2], x=['Mobile','Soil','Biomass Burning'], hue='target', kind='kde',
fill=True, palette=sns.color_palette('bright')[:3], height=5, aspect=1.5)
但是,我 运行 再次关注数据帧长度不同的问题。谢谢!
一个选项是 melt
数据帧,concat
它们,然后使用 hue
和 displot
:
data = pd.concat([df.melt(), df1.melt(), df2.melt()], ignore_index=True)
sns.displot(data=data, x='value', hue='variable', kind='kde')
输出:
使用 melt
的 var_name
和 value_name
参数以获得比“变量”和“值”更有意义的标识符,例如
kws = {'var_name': 'Source', 'value_name': 'Measurements'}
data = pd.concat([df.melt(**kws), df1.melt(**kws), df2.melt(**kws)],
ignore_index=True)
sns.displot(
data=data, x='Measurements', hue='Source', kind='kde',
fill=True, palette=sns.color_palette('bright')[:3], height=5, aspect=1.5
)
输出: