Python实现类别频数统计与水平条形图绘制
本文介绍如何使用Python进行类别频数统计并绘制水平条形图。通过自定义函数实现数据分组与频数计算,利用Matplotlib的bar方法生成水平条形图,并解决类别乱序等常见问题。同时补充了在Jupyter Notebook中离线配置MathJax以支持LaTeX公式渲染的方法,适用于需要简洁展示大量类别数据场景。
数据分组与频数分布表构建
1、数据分组-->频数分布表
环境配置与频数计算实现
环境配置:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
根据设定的间隔将数据划分为若干组,统计各组内的频数。由于未找到现成的合适函数,此处编写了一个自定义函数,其功能类似于直方图处理,旨在为绘制水平条形图准备数据。选择水平条形图的原因在于,当类别数量较多时,水平布局能提供更简洁直观的视觉效果,这仅为个人建议。以下提供相关代码,不再赘述代码具体含义。
def data_count(dataa, r1, r2, step):
r = pd.DataFrame(np.random.randn(1, 2))
r.drop(0, inplace=True)
while r1+step <= r2:
num = 0
for j in range(len(dataa)):
if dataa[j] >= r1 and dataa[j] < r1+step:
num = num + 1
f = "%s~%d" % (r1, r1+step)
# r = r.append([[int(r1), num], ]) # 使用单数表示
r = r.append([[f, num], ]) # 使用范围表示
r1 = r1 + step
return r
需注意数据范围的界定原则为“含上界不含下界”,即区间表示为 1⩽data<5。采用此规则可确保数据分组不重不漏。
2、频数计算
此处演示调用上述 data_count 函数进行频数计算的过程。首先观察原始数据形态,出于隐私或简化考虑,暂不公开具体数据,读者可根据自身数据情况自行调整。

测试 data_count 函数代码:
data_gap1 = data_count(g11[:], 1, 51, 1) data_gap2 = data_count(g22[:], 1, 51, 1)
调用过程较为简单,此处展示输出结果,如下图所示:

输出结果
该函数表现良好,只要输入最小值、最大值及间隔参数,即可生成频数分布表。
水平条形图绘制与注意事项
3、水平条形图
def plot_bar(plot_data, title):
plt.figure(figsize=(10, 15))
y = plot_data.iloc[:, 1].values
tt = list(range(len(y)))
index = plot_data.iloc[:, 0].values
plt.bar(left=0, bottom=list(range(len(y))), width=y, color='blue', height=0.5,
orientation='horizontal') # 水平对应bottom&width, height表示bar的宽度
plt.yticks(tt, index)
plt.ylabel('数据范围')
plt.xlabel('频数')
plt.title(title)
plt.show()
关键代码为 plt.bar(left=0, bottom=list(range(len(y))), width=y, color='blue', height=0.5,orientation='horizontal')。其中,left 参数指定条形图的起始位置(最左侧),height 参数定义条形图的高度;若条形过粗,可通过 width 调整宽度。注意,若绘制多个条形图需使用元组,yerr 参数用于防止条形图触顶。orientation='horizontal' 指定绘制水平条形图,若使用 barh 方法则可省略此参数设置。
存在一个潜在问题:若直接使用 bottom=类别数据,文本格式的类别可能出现乱序。解决方法是先指定位置再指定类别,例如通过 plt.yticks(tt, index) 实现排序。

水平条形图
Jupyter Notebook中MathJax离线配置
补充知识:在ipython notebook中添加latex公式
1 MathJax 的安装
ipython notebook中数学公式的渲染使用MathJax。一般网络较好的情况下,MathJax可以在线使用,但是如果希望离线使用,需要将其安装到本地磁盘中,常用的方法是在ipython notebook中使用以下命令:
from IPython.external.mathjax import install_mathjax
install_mathjax()
2.生成配置文件
安装完mathjax之后可以正常import latex,但是执行Latex(r'S\sqrt{x^2+y^2}$')后显示的是‘$\sqrt{x^2+y^2}$'这样字符串;
原来还需要生成配置文件,方法是:在命令行中运行 ipython profile create,执行完成会在./ipython/profile_default 目录下生成
一系列的配置文件,其中包括ipython_notebook_config.py文件;有地方看到需要修改该配置文件,取消 c.NotebookApp.enable_mathjax=True;
的注释,大家可以试一下,我自己没有取消这行注释,再打开ipnb文件时公式都能正常渲染,耶~
第一次记录blog,一方面跟大家一起学习,一方面方便以后回顾,毕竟记性差了许多,哈哈~
以上这篇python实现读取类别频数数据画水平条形图案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













