You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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()

关键步骤解释

  1. 筛选高频类别:
    用value_counts()快速统计每个类别的出现次数,然后通过布尔索引[category_counts > 5]筛选出频数大于5的类别,直接过滤掉低频数据。
  2. X轴自动匹配筛选结果:
    用筛选后的filtered_categories绘图,X轴会自动只显示这些被保留的类别名称,完全符合你的第二个需求。
  3. 语法修正:
    把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:07:42