如何使用Matplotlib Pyplot绘制直方图时仅显示频数大于5的区间并优化X轴标签
解决CSV类别频数直方图的两个需求
我来帮你搞定这两个问题,先提一句:你的原代码里有个小语法错误——fig.savefig的位置放错了,而且括号没配对好,先把这个修正,再解决你说的核心需求。
首先,你的attack_website列是类别型数据(有字符串、-1这类标识),用直方图其实不如柱状图直观——直方图更适合连续数值型数据,而柱状图能清晰展示每个类别的频数。下面的方案会同时解决你的两个问题:只保留频数>5的类别,X轴只显示这些被保留的名称。
完整解决代码
import pandas as pd import matplotlib.pyplot as plt # 读取CSV文件 df = pd.read_csv(filename) # 第一步:统计每个类别的出现次数,筛选出频数>5的类别 category_counts = df["attack_website"].value_counts() filtered_categories = category_counts[category_counts > 5] # 创建绘图对象 fig, ax = plt.subplots() # 绘制柱状图(完美适配类别型频数展示) ax.bar(filtered_categories.index, filtered_categories.values, width=0.7) # 调整X轴标签,避免重叠(可选但实用) ax.set_xticklabels(filtered_categories.index, rotation=45, ha="right") # 设置图表基础信息 ax.set_title("Attack Website Frequency (Only Counts > 5)") ax.set_xlabel("Website/Category") ax.set_ylabel("Frequency") # 自动调整布局,防止标签被截断 plt.tight_layout() # 保存PDF fig.savefig("phishHistogram.pdf") # 显示图表 plt.show()
关键步骤解释
- 筛选高频类别:
用value_counts()快速统计每个类别的出现次数,然后通过布尔索引[category_counts > 5]筛选出频数大于5的类别,直接过滤掉低频数据。 - X轴自动匹配筛选结果:
用筛选后的filtered_categories绘图,X轴会自动只显示这些被保留的类别名称,完全符合你的第二个需求。 - 语法修正:
把fig.savefig放在绘图完成后、plt.show()之前,并且用plt.subplots()更规范地创建绘图对象,避免原代码的括号错误。
如果你坚持要用直方图(虽然不推荐类别型数据用),也可以基于筛选后的数据来绘制:
# 提取筛选后的类别对应的原始数据 filtered_data = df[df["attack_website"].isin(filtered_categories.index)] plt.hist(filtered_data["attack_website"], bins=len(filtered_categories), rwidth=0.7) plt.xticks(rotation=45, ha="right") plt.tight_layout() plt.savefig("phishHistogram.pdf") plt.show()
不过还是推荐用柱状图,展示效果更清晰。
内容的提问来源于stack exchange,提问作者Blake Martin
相关产品推荐
相关产品推荐

