原图解释
论文doi:https://doi.org/10.1016/j.jclepro.2020.120706
图片表示为10个建筑指标与LST之间的关系,用的是提升回归树模型来计算特征重要性,左边的图片为四个季节下的特种重要性柱状图,右边为点线图
柱状图代码实现
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
import numpy as np
# 随机生成四个季度的数据
np.random.seed(0) # 设置随机种子以确保可复现性
n_samples = 100 # 用于每个季度的样本数量
n_features = 8 # 特征数量
# 生成四组随机数据代替四个季度的数据
data_q1 = np.random.rand(n_samples, n_features)
data_q2 = np.random.rand(n_samples, n_features)
data_q3 = np.random.rand(n_samples, n_features)
data_q4 = np.random.rand(n_samples, n_features)
# 选择特征和目标
features = [
"Feature1",
"Feature2",
"Feature3",
"Feature4",
"Feature5",
"Feature6",
"Feature7",
"Feature8",
]
target = "Target"
# 创建单独的画布
fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(8, 12))
models = [RandomForestRegressor() for _ in range(4)]
quarterly_data = [data_q1, data_q2, data_q3, data_q4]
# 自定义季度的颜色
colors = ["#66cd00", "#cd2626", "#ffa500", "#0000ff"] # 设置每个季度的柱体外框颜色
# 季度标签
seasons = ["(a) Spring", "(b) Summer", "(c) Autumn", "(d) Winter"]
# 定义字体
plt.rcParams["font.family"] = "Times New Roman"
# 训练四个季度的随机森林回归模型并绘制特征重要性柱状图
for i, (model, q_data, color, season) in enumerate(
zip(models, quarterly_data, colors, seasons)
):
target_data = np.random.rand(n_samples) # 随机生成目标数据
model.fit(q_data, target_data)
feature_importance = model.feature_importances_
ax = axes[i]
ax.bar(features, feature_importance, color="white", edgecolor=color, linewidth=1.5)
# 设置纵坐标范围
ax.set_ylim(0, 0.4)
# 添加季度标签
ax.text(0.01, 0.9, season, transform=ax.transAxes, fontsize=12, weight="bold")
# 不显示x轴刻度
ax.tick_params(bottom=False)
# 旋转x轴的标签
ax.set_xticks(range(len(features)))
ax.set_xticklabels(features, rotation=45, ha="right")
# 去掉上边框和右边框
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
# 打印每个特征的重要性
print(f"Season {season} Feature Importance:")
for feat, importance in zip(features, feature_importance):
print(f"{feat}: {importance}")
# 调整子图之间的垂直间距
plt.subplots_adjust(hspace=1)
# 保存图片到本地
plt.savefig("特征重要性柱状图.png", dpi=300, bbox_inches="tight")
结果展示
点线图代码展示
理论上转换下坐标轴的位置,调节下范围,在调整下点和线之间的距离就能绘制出来了,但是 matplotlib中似乎不能调整点和线之间的距离
"""接上部分代码"""
# 创建新的画布用于绘制点线图
fig2, ax2 = plt.subplots(figsize=(4, 12))
# 绘制四个点线图
for i, (model, q_data, color, season) in enumerate(
zip(models, quarterly_data, colors, seasons)
):
feature_importance = model.feature_importances_
x_values = feature_importance[::-1]
y_values = range(len(features))
for j in range(1, len(x_values)):
# 绘制连接线段
ax2.plot(
[x_values[j - 1], x_values[j]],
[y_values[j - 1], y_values[j]],
color=color,
linestyle="-",
linewidth=1,
)
# 绘制空心圆点
ax2.plot(
x_values,
y_values,
marker="o",
linestyle="none",
color=color,
markersize=10,
markerfacecolor="none",
)
# 设置横坐标范围
ax2.set_xlim(0.4, 0)
# 去掉左边框,上边框和右边框
ax2.spines["left"].set_visible(False)
ax2.spines["top"].set_visible(False)
ax2.spines["right"].set_visible(False)
# 在右边边框上显示y轴标签和刻度
ax2.yaxis.set_label_position("right")
ax2.yaxis.set_ticks_position("right")
ax2.yaxis.set_tick_params(pad=10)
# 设置y轴的刻度位置和标签
ax2.set_yticks(list(range(len(features))))
ax2.set_yticklabels(features)
# 绘制x=0的竖线并限制其长度
ax2.axvline(x=0, ymin=0.05, ymax=0.95, color="black", linewidth=1)
# 保存图片到本地
plt.savefig("特征重要性点线图.png", dpi=300, bbox_inches="tight")
plt.show()
结果展示
origin复现
于是忙碌了一下午的方师傅还是打开了origin
将计算出来的特征重要性复制到origin中
全选数据后绘制点线图,先选装xy轴
设置坐标轴
移动坐标轴,x轴同理
调整点和线之间的距离
若图形显不全则
最后修整细节
需要origin工程文件的同学公众号(同名)后台回复11
往期回顾
在我的公众号(同名)中会持续更新好看的SCI论文图片的代码复刻推文,往期图片如下,欢迎大家互相交流