【科研绘图】特种重要性柱状图+点线图(python+origin)

原图解释

论文doi:https://doi.org/10.1016/j.jclepro.2020.120706

image-20231021115815462

图片表示为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中

image-20231021121027953

全选数据后绘制点线图,先选装xy轴

image-20231021121901120

设置坐标轴

image-20231021121946934

移动坐标轴,x轴同理

image-20231021122059736

调整点和线之间的距离

image-20231021122200844

若图形显不全则

image-20231021122648430

最后修整细节

image-20231021122320413

需要origin工程文件的同学公众号(同名)后台回复11

往期回顾

在我的公众号(同名)中会持续更新好看的SCI论文图片的代码复刻推文,往期图片如下,欢迎大家互相交流

image-20231021135108000

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GIS探险家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值