我试图用以下代码在SeaBorn中绘制不同的直方图:
ax = sns.displot(data=municipios,
x="DENSIDAD_HABITACIONAL",
multiple="stack",
height=6,
aspect=2,
kind='hist',
bins=AGRUPAMIENTO,
stat='density',
kde=True).set(title='Histograma de Densidad Habitacional')
ax.set(xlabel='Densidad Habitacional (hab/km´2)', ylabel='Cantidad relativa de municipios')
plt.axvline(x=municipios.DENSIDAD_HABITACIONAL.mean(),
color='red')
plt.axvline(x=municipios.DENSIDAD_HABITACIONAL.median(),
color='green')
plt.axvline(x=moda(municipios.DENSIDAD_HABITACIONAL,AGRUPAMIENTO),
color='blue')
plt.legend(handles=etiquetas)
ax = sns.displot(data=municipios,
x="PORCENTAJE_NBI",
multiple="stack",
height=6,
aspect=2,
kind='hist',
bins=AGRUPAMIENTO,
stat='density',
ax=0,
kde=True).set(title='Histograma de %NBI')
ax.set(xlabel='%NBI', ylabel='Cantidad relativa de municipios')
plt.axvline(x=municipios.PORCENTAJE_NBI.mean(),
color='red')
plt.axvline(x=municipios.PORCENTAJE_NBI.median(),
color='green')
plt.axvline(x=moda(municipios.PORCENTAJE_NBI,AGRUPAMIENTO),
color='blue')
我的结果是这样的:
因此,在屏幕截图中显示的第一个直方图中,第一个条形(位于所有条形的左侧)从范围0开始。但是,在第二个直方图中,我们可以看到第一个条形并不是从0开始,而是从一个更大的值开始。
此外,我还想在绘制的轴中显示分隔每个条形的值,也就是说,分隔区间的分隔符,而不是默认情况下自动显示的分隔符(我的意思是,例如,在第二个直方图中,[0.0,2.29,4.57,...]而不是[0,5,10,...])。
我定义了一个函数,它返回一个包含每个区间的频率的序列,以及一个包含这些分隔符的序列,如下所示:
频率:[5.0、60.0、30.0、17.0、10.0、11.0、3.0、2.0、2.0、0.0、1.0]
分隔符号:[0.0、2.29、4.57、6.86、9.15、11.44、13.72、16.01、18.3、20.59、22.87、25.16]
通过这种方式,我可以在分析形式中看到这些值,而不是在图形形式中。这些是与所示的第二个直方图(NBI百分比)相对应的值。
我还使用该函数返回的值来计算另一个已定义函数中变量的众数。如果有人感兴趣,我可以共享这两个函数的代码(计算间隔的函数和计算众数的函数)。
最后,通过查看这些值,我还可以发现存在一些问题:在第二个间隔中,我们有60个观测值,在第三个间隔中,我们有30个观测值。但是,在直方图中,我们可以看到第三个柱的高度低于第二个柱的一半,因为30正好是60的一半。
有人知道我该怎么做吗?
多谢了!
1条答案
按热度按时间ruarlubt1#
@约翰C
我试着将一个序列传递给“displot”的“bins”属性,并很好地解决了直方图从零开始的问题,以及列高的正确比例问题。因此,我的代码中提到的函数,以及bin间隔的常量如下(西班牙语注解):
区间常数:
间隔函数:
模式功能:
一旦我们定义了这些函数,我们就可以正确地绘制直方图:
那么,我的结果是:
现在,我们可以看到,通过函数计算的模式值与用于查找它的图形方法完全一致。
所以,我已经解决了最重要的问题,但没有解决坐标轴中显示的分隔符之一。我试着用'histplot'代替'displot',看看我是否能解决第二个问题,但我仍然不能。
下面是我的历史图代码:
而我的结果是:
作为详细信息,以下是每个度量的值:
平均值:6.468369
中位数:500万
众数:3.767273