原图
论文doi:https://doi.org/10.1016/j.rse.2023.113650
图片表示全球多个城市之间两个数值之间的散点图,其中按照洲来分组。
python复刻的难点为自定义图例
代码复现
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
# 创建一个包含大陆名称和对应颜色的字典
continents = {
"Africa": "#000032",
"Asia": "#228c5e",
"Europe": "#d6e872",
"North America": "#f3d277",
"Oceania": "#c76732",
"South America": "#990100",
}
# 创建图例
patches = [
mpatches.Patch(
facecolor=color,
edgecolor="black",
lw=1,
label=continent,
)
for continent, color in continents.items()
]
# 创建两组随机数
np.random.seed(0) # 设置随机种子以确保结果可重复
n_samples = 50 # 每个类别的样本数量
n_categories = 6 # 类别数量
# 生成六个类别的随机数据
data = {}
for category in continents: # 使用与continents字典一致的键
x = np.random.rand(n_samples) # 生成50个随机X值
y = x + np.random.rand(n_samples) # 生成50个随机Y值,与X相关
data[category] = {"X": x, "Y": y}
# 设置全局的字体大小和样式
plt.rcParams["font.size"] = 14
plt.rcParams["font.family"] = "Times New Roman"
# 创建一个自定义大小的子图
fig, ax = plt.subplots(figsize=(8.5, 6))
for category, values in data.items():
x = values["X"]
y = values["Y"]
color = continents[category] # 使用图例中定义的颜色
plt.scatter(x, y, label=category, marker="H", c=color)
# 对所有数据进行线性拟合
all_x = np.array([x for values in data.values() for x in values["X"]])
all_y = np.array([y for values in data.values() for y in values["Y"]])
coefficients = np.polyfit(all_x, all_y, 1) # 进行线性拟合,得到拟合系数
# 绘制线性回归线
plt.plot(all_x, np.polyval(coefficients, all_x), color="red")
# 添加标题和轴标签
plt.title("Spatial Correlation")
plt.xlabel("δISP Trends")
plt.ylabel("IS Trends")
# 显示图例并将其放置在图形的右下方,图框外面
plt.legend(
handles=patches,
bbox_to_anchor=(1.3, 0.22), # 调整图例位置
frameon=False, # 去掉图例外框
labelspacing=-0.16, # labelspace为图例上下之间的距离
handlelength=0.8, # handlelength为图例图形的宽度
handletextpad=0.2, # 图例形状于文本之间的距离
)
# 调整坐标轴刻度朝内
plt.tick_params(axis="both", direction="in")
# 自动调整图片布局
plt.tight_layout()
# 保存图片到本地
plt.savefig("分组散点图.png", dpi=300)
# 显示图形
plt.show()
结果展示
原图的图例外框没复刻出来,有大神愿意完善的话私信我,我给每个图例都加了框,若不需要则把
# 创建图例
patches = [
mpatches.Patch(
facecolor=color,
edgecolor="black",
lw=1,
label=continent,
)
for continent, color in continents.items()
]
改成
# 创建图例
patches = [
mpatches.Patch(
facecolor=color,
label=continent,
)
for continent, color in continents.items()
]
往期回顾
在我的公众号(同名)中会持续更新好看的SCI论文图片的代码复刻推文,往期图片如下,欢迎大家互相交流
感谢大家花时间来阅读本文,小编水平有限,有失误之处请大家斧正!