如何使用Matplotlib复刻R中ggplot2绘制的散点图?
用Matplotlib复刻ggplot2风格散点图
以下是针对你的需求,用Matplotlib实现包含散点、国家标签、中位数虚线及标注的完整方案,代码可直接适配你的字典数据:
1. 数据预处理
首先把你提供的Python字典转成Pandas DataFrame,方便后续绘图操作:
import pandas as pd import matplotlib.pyplot as plt # 替换成你的实际字典数据 your_data = { "country": ["China", "USA", "Japan", "Germany", "India"], "x_var": [100, 150, 80, 90, 70], "y_var": [50, 70, 60, 65, 45] } df = pd.DataFrame(your_data)
2. 绘制基础散点
创建画布和坐标轴,画出核心散点:
fig, ax = plt.subplots(figsize=(10, 6)) # 绘制散点,可根据原图表调整颜色、大小、透明度 ax.scatter(df["x_var"], df["y_var"], color="#1f77b4", s=100, alpha=0.7)
3. 添加国家名称标签
遍历每个数据点,在散点旁添加对应国家名称,可通过偏移量避免重叠:
for _, row in df.iterrows(): # 这里的+0.5和0是偏移量,可根据你的数据调整 ax.text(row["x_var"] + 0.5, row["y_var"], row["country"], fontsize=10, ha="left", va="center")
4. 添加中位数虚线与标注
计算x、y变量的中位数,绘制虚线并添加标注文本:
# 计算中位数 x_med = df["x_var"].median() y_med = df["y_var"].median() # X轴中位数虚线 ax.axvline(x=x_med, color="#ff7f0e", linestyle="--", linewidth=2) # 标注X轴中位数,位置可按需调整 ax.text(x_med, ax.get_ylim()[0] - 2, f"X中位数: {x_med:.1f}", color="#ff7f0e", ha="center", va="top") # Y轴中位数虚线 ax.axhline(y=y_med, color="#2ca02c", linestyle="--", linewidth=2) # 标注Y轴中位数,旋转90度贴近Y轴 ax.text(ax.get_xlim()[0] - 3, y_med, f"Y中位数: {y_med:.1f}", color="#2ca02c", ha="right", va="center", rotation=90)
5. 优化图表样式(贴近ggplot2风格)
如果需要更接近ggplot2的视觉效果,可调整坐标轴、网格和标题:
ax.set_xlabel("X变量名称", fontsize=12) ax.set_ylabel("Y变量名称", fontsize=12) ax.set_title("图表标题", fontsize=14, pad=20) # 开启浅色网格,模拟ggplot2背景 ax.grid(True, linestyle="-", alpha=0.3) # 调整坐标轴范围,防止标签超出画布 ax.set_xlim(ax.get_xlim()[0] - 5, ax.get_xlim()[1] + 5) ax.set_ylim(ax.get_ylim()[0] - 3, ax.get_ylim()[1] + 3) plt.tight_layout() plt.show()
注意事项
- 散点颜色、大小、虚线样式可根据原ggplot2图的参数直接替换
- 如果数据量较大导致标签重叠,可安装
adjustText库,用adjust_text()函数自动优化标签位置 - 所有偏移量(如文本的x/y偏移、坐标轴范围调整)需根据你的实际数据微调
内容的提问来源于stack exchange,提问作者silent_hunter
相关产品推荐
相关产品推荐

