Matplotlib绘制散点图时X轴高亮与图例添加问题求助
Matplotlib图表复现解决方案
针对你提出的两个复现问题,可直接参考以下实现方法修改代码:
1. X轴低数值区域高亮实现
通过Matplotlib坐标轴对象的axvspan()方法即可绘制指定X轴区间的半透明高亮层,将图层顺序zorder设为0可以保证高亮块在散点下方,不会遮挡数据点:
# 获取当前绘图坐标轴对象 ax = plt.gca() # 高亮X轴0-4区间(覆盖Si/Al=1、3两个低数值点位),浅灰色半透明填充 ax.axvspan(0, 4, color='gray', alpha=0.2, zorder=0)
如果需要调整高亮范围、颜色深浅,直接修改方法内的起止X坐标、alpha透明度参数即可。
2. 分类图例正确添加方法
你原有代码是按X轴点位循环,单次绘制3个不同分类的散点,Matplotlib无法自动识别分类归属,因此无法生成正确图例。需要调整绘图逻辑:按水含量分类单独遍历绘图,每次绘图时传入对应label参数,最后调用legend()即可自动生成匹配的图例。
修改后的完整可运行代码如下:
import matplotlib.pyplot as plt # 原始数据集 x = [192, 188/4, 168/24, 144/48, 96/96] ys = [[2.20, 0.758, 0.691], [1.44, 0.708, 0.733], [0.491, 0.379, 0.440], [0.349, 0.350, 0.165], [0.199, 0.157, 0.163]] # 分类配置:对应颜色、图例标签 category_conf = [ {"color": "r", "label": "Water_Cubic12"}, {"color": "y", "label": "Water_Cubic24"}, {"color": "g", "label": "Water_Cubic48"} ] # 按分类逐组绘制散点 for cat_idx, conf in enumerate(category_conf): # 提取当前分类在所有X点位对应的Y值 cat_y_values = [y_group[cat_idx] for y_group in ys] plt.scatter(x, cat_y_values, color=conf["color"], label=conf["label"]) # 添加X轴低数值区高亮 ax = plt.gca() ax.axvspan(0, 4, color='gray', alpha=0.2, zorder=0) # 坐标轴与标题配置 plt.xticks([192, 188/4, 168/24, 144/48, 96/96]) plt.xlabel("Si/Al Ratio") plt.ylabel("Diff Coeff (Ang**2)") plt.title("Si/Al vs Diff Coeff at 300k for Water Content (12, 24, 48)") # 放置图例在图表外侧,避免遮挡数据 plt.legend(loc=2, bbox_to_anchor=(1.05, 1), borderaxespad=0., fontsize=11) # 自动调整布局,防止标签、图例被画布截断 plt.tight_layout() plt.show()
补充优化:代码末尾添加的
plt.tight_layout()可以自动适配画布元素位置,避免外侧图例、坐标轴标签被边缘截断。
内容的提问来源于stack exchange,提问作者Saha_1994
相关产品推荐
相关产品推荐

