Python 如何从频率表中绘制直方图和分布?
我有一张频率表 我一直想把这些数据画成这样 所以试过这个,Python 如何从频率表中绘制直方图和分布?,python,plot,seaborn,histogram,distribution,Python,Plot,Seaborn,Histogram,Distribution,我有一张频率表 我一直想把这些数据画成这样 所以试过这个, to_plot = compare_df[['counts', 'theoritical counts']] bins=[0,2500,5000,7500,10000,12500,15000,17500,20000] sns.displot(to_plot,bins=bins) 但是结果是这样的,, 知道我做错了什么吗?请帮忙。两件事: 当您向sns.displat提供数据帧时,还需要指定将哪个列作为xkwarg用于分发 这就
to_plot = compare_df[['counts', 'theoritical counts']]
bins=[0,2500,5000,7500,10000,12500,15000,17500,20000]
sns.displot(to_plot,bins=bins)
但是结果是这样的,,
知道我做错了什么吗?请帮忙。两件事:
sns.displat
提供数据帧时,还需要指定将哪个列作为x
kwarg用于分发
sns.displat
获得多个发行版的方法,但您可以大致这样使用sns.histplot
:
首先,请注意,仅从频率创建kde绘图时,会丢失重要信息
sns.histplot()
有一个参数weights=
,可以处理频率。我没有看到使用长数据帧和hue
实现这一点的方法,但是您可以为每个列分别调用histplot
。以下是从生成的数据开始的示例:
导入matplotlib.pyplot作为plt
导入seaborn作为sns
作为pd进口熊猫
将numpy作为np导入
sns.set()
容器=np.数组([0,2500,5000,7500,10000,12500,15000,17500,20000])
df=pd.DataFrame({'counts':np.random.randint(2,30,8),
“理论计数”:np.random.randint(2,30,8)},
索引=局部放电间隔(0,20000,频率=2500))
df[‘理论计数’]=(3*df[‘计数’]+df[‘理论计数’)//4
图,ax=plt.子批次()
对于列,zip中的颜色(['counts','theory counts'],['cornflowerblue','crimson']):
sns.histplot(x=(bin[:-1]+bin[1:])/2,权重=df[column],bin=8,binrange=(02000),
kde=True,kde_kws={'cut':.3},
颜色=颜色,alpha=0.5,标签=列,ax=ax)
ax.图例()
斧头组(范围(0,20001,2500))
plt.show()
由于箱子宽度变化很大,因此没有足够的信息来绘制合适的kde曲线。此外,条形图似乎比直方图更合适。以下是一个示例:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
sns.set()
bins = [0, 250, 500, 1000, 1500, 2500, 5000, 10000, 50000, np.inf]
bin_labels = [f'{b0}-{b1}' for b0, b1, in zip(bins[:-1], bins[1:])]
df = pd.DataFrame({'counts': np.random.randint(2, 30, 9),
'theoretical counts': np.random.randint(2, 30, 9)})
df['theoretical counts'] = (3 * df['counts'] + df['theoretical counts']) // 4
fig, ax = plt.subplots(figsize=(10, 4))
sns.barplot(data=df.melt(), x=np.tile(bin_labels, 2), y='value',
hue='variable', palette=['cornflowerblue', 'crimson'], ax=ax)
plt.tight_layout()
plt.show()
有一些选项,例如
dodge=False,alpha=0.5
在同一点绘制条形图。非常感谢!!!它工作得很好。还有一个问题,如果每个箱子的宽度不一样,比如[0250001000150025005000100000000,float('inf'),我该怎么办?在这种情况下,有意义的kde曲线缺少太多信息。而不是直方图,条形图更适合。我用一个额外的例子更新了答案。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
sns.set()
bins = [0, 250, 500, 1000, 1500, 2500, 5000, 10000, 50000, np.inf]
bin_labels = [f'{b0}-{b1}' for b0, b1, in zip(bins[:-1], bins[1:])]
df = pd.DataFrame({'counts': np.random.randint(2, 30, 9),
'theoretical counts': np.random.randint(2, 30, 9)})
df['theoretical counts'] = (3 * df['counts'] + df['theoretical counts']) // 4
fig, ax = plt.subplots(figsize=(10, 4))
sns.barplot(data=df.melt(), x=np.tile(bin_labels, 2), y='value',
hue='variable', palette=['cornflowerblue', 'crimson'], ax=ax)
plt.tight_layout()
plt.show()