如何在散点图对应数据点上添加能源类型的value_counts计数标注
如何在散点图对应数据点上添加能源类型的value_counts计数标注
嗨,我来帮你搞定这个问题!你之前遇到的“计数显示在图下方导致图变小”的问题,应该是直接把计数打印出来了,而不是把它们作为标注嵌入到散点图里。下面我给你两种实用的解决方案,按需选择就行:
方案1:给每个数据点单独标注计数
这种方法适合数据量不大的情况,每个散点上方都会显示对应能源类型的总计数:
首先,我们先给数据集新增一列,把每个能源类型的计数映射到对应的数据行上:
import pandas as pd import matplotlib.pyplot as plt # 假设你的数据集叫pollution,先添加计数列 pollution['energie_count'] = pollution['Energie'].map(pollution['Energie'].value_counts())
然后绘制散点图,并遍历每个数据点添加标注:
# 绘制基础散点图 plt.figure(figsize=(10,6)) plt.scatter(pollution['Global Power Warming'], pollution['Nox'], alpha=0.7) # 给每个点添加计数标注 for x, y, count in zip(pollution['Global Power Warming'], pollution['Nox'], pollution['energie_count']): # ha='center'让标注水平居中,va='bottom'让标注在点的上方,避免遮挡 plt.annotate(str(count), (x, y), fontsize=8, ha='center', va='bottom') # 完善图表信息 plt.xlabel('Global Power Warming') plt.ylabel('Nox Emission') plt.title('Nox vs Global Power Warming with Energie Class Counts') plt.tight_layout() plt.show()
方案2:在每个能源类型的聚类中心标注计数
如果你的数据点很多,逐个标注会显得杂乱,那可以计算每个能源类型数据点的中心位置,只在中心标注该类型的总计数,这样更清晰:
import pandas as pd import matplotlib.pyplot as plt # 获取每个能源类型的总计数 energie_counts = pollution['Energie'].value_counts() # 计算每个能源类型的平均坐标(聚类中心) cluster_centers = pollution.groupby('Energie').agg( avg_x=('Global Power Warming', 'mean'), avg_y=('Nox', 'mean') ).reset_index() # 把计数合并到中心数据里 cluster_centers['count'] = cluster_centers['Energie'].map(energie_counts) # 绘制散点图 plt.figure(figsize=(10,6)) plt.scatter(pollution['Global Power Warming'], pollution['Nox'], alpha=0.5) # 在每个聚类中心添加标注,还可以加个白色背景框避免被散点遮挡 for _, row in cluster_centers.iterrows(): plt.annotate( f"{row['Energie']}: {row['count']}", (row['avg_x'], row['avg_y']), fontsize=10, ha='center', va='bottom', bbox=dict(facecolor='white', edgecolor='gray', alpha=0.8) ) # 完善图表信息 plt.xlabel('Global Power Warming') plt.ylabel('Nox Emission') plt.title('Nox vs Global Power Warming with Energie Class Cluster Counts') plt.tight_layout() plt.show()
为什么之前的方法会让图变小?
你之前直接枚举energie_counts并输出的话,这些计数会被打印在绘图区域的下方(属于控制台输出),matplotlib会自动缩小绘图区域来给这些文本腾出空间,所以才会导致图变小。现在我们用plt.annotate()把计数直接画在图上,就不会出现这个问题啦!
备注:内容来源于stack exchange,提问作者Raios




