如何在自定义可视化类内自动统计列类别频次绘制柱状图
解决方案
不需要额外写循环逻辑,pandas的value_counts()原生就返回类别与对应频次的映射关系,你现有代码仅提取了去重类别作为x轴刻度,没有同步取频次作为柱高,做如下调整即可实现自动统计列值频次绘图的需求:
- 给
height形参设置默认值None,区分用户是否手动指定柱高 - 当入参
x为列名字符串时,暂存value_counts()的返回结果,若用户未手动传height,自动将频次序列赋值给height作为柱高 - 修复现有代码的隐性问题:未传入图例label时直接调用
legend()会触发警告,增加判断逻辑;增加x轴标签旋转、自动布局适配,避免标签重叠截断,和你提供的参考效果一致。
注意:初始化类时必须传入实际的pandas DataFrame对象,不要给变量名加引号传字符串
修改后的完整Visualizer类代码
import matplotlib.pyplot as plt import pandas as pd class Visualizer: def __init__(self, dataframe): if not isinstance(dataframe, pd.DataFrame): raise TypeError("初始化请传入实际的pandas DataFrame对象,不要传字符串形式的变量名") self.df = dataframe def plot_bar(self, x, height=None, width=0.8, title = "",xlabel = "", ylabel = "Count",color = "#1f77b4", **kwargs): fig, ax = plt.subplots(figsize=(11, 9)) # x传入列名字符串时,自动统计列值频次 if isinstance(x, str): count_result = self.df[x].value_counts() x = count_result.index # 未手动指定柱高时,自动用统计到的频次作为柱高 if height is None: height = count_result.values plt.bar( x=x, height=height, width=width, color=color, alpha=0.5, **kwargs ) plt.xlabel(xlabel, fontsize=20) plt.ylabel(ylabel, fontsize=20) plt.xticks(fontsize=16, rotation=45) plt.yticks(fontsize=16) # 仅当传入label参数时才渲染图例,避免无图例项报错 if kwargs.get("label"): leg = plt.legend(loc='upper right', fancybox=True) leg.get_frame().set_alpha(0.5) plt.title(title, fontsize=20) plt.tight_layout() plt.show()
调用示例
# 传入实际的DataFrame变量df完成初始化 vizu = Visualizer(df) # 自动统计State列各类别频次绘图,不需要手动传入固定height值 vizu.plot_bar( x="State", width=0.25, title="Area vs State", xlabel="Area", ylabel="Rentalprice", color='r' )
该修改完全兼容原有逻辑:如果你需要绘制自定义柱高的柱状图(比如按其他列聚合计算高度),仍然可以手动给
height传值,不会冲突。

内容的提问来源于stack exchange,提问作者Sanil
相关产品推荐
相关产品推荐

