python生成柱状堆积图:以生成包含3个柱状堆积图子图为例

本文展示了如何从三个不同模型的Excel文件中提取数据,计算ET(能量传递)的Es、Ec和Ei各组分占比,并用堆积柱状图形式可视化结果,分别对应PT-JPL、PML和TSEB模型。
摘要由CSDN通过智能技术生成
# -*- coding: utf-8 -*-
"""
生成3种模型的组分堆叠图——堆积柱状图
思路:
1. 首先分别遍历3个模型文件夹下的文件,计算各个组分的占比
2. subplots画图,3行1列
YMJ 20230515 21:42
"""
import datetime
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, AutoDateLocator
from sklearn.linear_model import LinearRegression
import seaborn as sns
from matplotlib.pyplot import MultipleLocator
import pylab
from pylab import mpl
from datetime import datetime
import matplotlib.dates as mdates
import datetime,time
 
params = {
    'axes.labelsize': '20',           #轴上字
    'xtick.labelsize':'16',           #轴图例
    'ytick.labelsize':'16',           #轴图例
    'lines.linewidth': "1.2",             # 线宽
    'legend.fontsize': '16',          #图例大小
    'figure.figsize': '12, 9'           # set figure size,长12,宽9
}
pylab.rcParams.update(params)           # set figure parameter
 
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ["Times New Roman"]
 
dir1 = 'D:\\YMJ_file\\通量数据相关\\All模型评价\\图4\\PTJPL'
file_list1 = []
for root,subroot,files in os.walk(dir1):
    for file in files:
        if file.endswith(".xlsx"):
            FM_NLS_file = os.path.join(root, file)
            file_list1.append(FM_NLS_file)
print(file_list1)
x = ["AR", "BJT", "CBS", "CL", "DM", "DSL", "DXI", "DHS", "DLD", "DLG", "HBA", \
     "HBS", "HL", "HZZ", "JYL", "MY", "NMC", "NQ", "QYZ", "SDQ", "YKO", "YKE"]
 
Es_sites1 = []
Ec_sites1 = []
Ei_sites1 = []
for i in range(len(file_list1)):
    print(file_list1[i])
    df = pd.read_excel(file_list1[i])
    data2 = df.loc[(df["E"] >= 0) & (df["E"] < 800)]
 
    # 产生每个站点的各个分量占比数据
    data2["date"] = data2["Date"].dt.date
    data2["Es_ratio"] = data2["Es"] / data2["E"]
    Es_ratio = data2["Es_ratio"].mean()
    data2["Ec_ratio"] = data2["Ec"] / data2["E"]
    Ec_ratio = data2["Ec_ratio"].mean()
    data2["Ei_ratio"] = data2["Ei"] / data2["E"]
    Ei_ratio = data2["Ei_ratio"].mean()
 
    Es_sites1.append(Es_ratio)
    Ec_sites1.append(Ec_ratio)
    Ei_sites1.append(Ei_ratio)
    # x.append(file_list1[i].split("\\")[-1].split(".xlsx")[0])
 
 
dir2 = 'D:\\YMJ_file\\通量数据相关\\All模型评价\\图4\\PML'
file_list2 = []
for root,subroot,files in os.walk(dir2):
    for file in files:
        if file.endswith(".xlsx"):
            FM_NLS_file = os.path.join(root, file)
            file_list2.append(FM_NLS_file)
print(file_list2)
 
Es_sites2 = []
Ec_sites2 = []
Ei_sites2 = []
for j in range(len(file_list2)):
    print(file_list2[j])
    df = pd.read_excel(file_list2[j])
    data2 = df.loc[(df["E"] >= 0) & (df["E"] < 800)]
 
    # 产生每个站点的各个分量占比数据
    data2["date"] = data2["Date"].dt.date
    data2["Es_ratio"] = data2["Es"] / data2["E"]
    Es_ratio = data2["Es_ratio"].mean()
    data2["Ec_ratio"] = data2["Ec"] / data2["E"]
    Ec_ratio = data2["Ec_ratio"].mean()
 
    Es_sites2.append(Es_ratio)
    Ec_sites2.append(Ec_ratio)
    Ei_sites2.append(0)
 
dir3 = 'D:\\YMJ_file\\通量数据相关\\All模型评价\\图4\\TSEB'
file_list3 = []
for root,subroot,files in os.walk(dir3):
    for file in files:
        if file.endswith(".xlsx"):
            FM_NLS_file = os.path.join(root, file)
            file_list3.append(FM_NLS_file)
print(file_list3)
 
Es_sites3 = []
Ec_sites3 = []
Ei_sites3 = []
for j in range(len(file_list3)):
    print(file_list3[j])
    df = pd.read_excel(file_list3[j])
    data2 = df.loc[(df["E"] >= 0) & (df["E"] < 800)]
 
    # 产生每个站点的各个分量占比数据
    data2["date"] = data2["Date"].dt.date
    data2["Es_ratio"] = data2["Es"] / data2["E"]
    Es_ratio = data2["Es_ratio"].mean()
    data2["Ec_ratio"] = data2["Ec"] / data2["E"]
    Ec_ratio = data2["Ec_ratio"].mean()
 
    Es_sites3.append(Es_ratio)
    Ec_sites3.append(Ec_ratio)
    Ei_sites3.append(0)
 
# 画图dpi=400
fig = plt.figure(dpi=400)
# 布局,3行,1列
gs = fig.add_gridspec(3, 1)
# 共享x轴
axs = gs.subplots(sharex=True, sharey=True)
# 产生横坐标的个数
x_num_list = range(1, len(x)+1)
axs[0].bar(x_num_list, Es_sites1, label='Es')
axs[0].bar(x_num_list, Ec_sites1, bottom=Es_sites1, label='Ec')
axs[0].bar(x_num_list, Ei_sites1, bottom=list(np.add(Es_sites1, Ec_sites1)), label='Ei')
axs[0].set_title('PT-JPL', fontsize=20)
axs[0].set_ylim(0, 1)
 
axs[1].bar(x_num_list, Es_sites2)
axs[1].bar(x_num_list, Ec_sites2, bottom=Es_sites2)
axs[1].bar(x_num_list, Ei_sites2, bottom=list(np.add(Es_sites2, Ec_sites2)))
axs[1].set_title('PML', fontsize=20)
 
axs[2].bar(x_num_list, Es_sites3)
axs[2].bar(x_num_list, Ec_sites3, bottom=Es_sites3)
axs[2].bar(x_num_list, Ei_sites3, bottom=list(np.add(Es_sites3, Ec_sites3)))
axs[2].set_title('TSEB', fontsize=20)
 
# 0.05指的是向坐标轴方向靠近,所有子图共用一个x、y文本
# fig.text(0.5, 0.03, 'Sites', ha='center', fontsize=12)
fig.text(0.03, 0.5, 'ET Component Fractions', va='center', rotation='vertical', fontsize=18)
 
plt.xticks(x_num_list, x, rotation='vertical')
fig.legend(ncol=3, loc="lower center")
fig.subplots_adjust(bottom=0.16)
 
 
outpath = os.path.join("D:\\YMJ_file\\通量数据相关\\All模型评价\\图4\\" + "ET组分占比.tiff")
plt.savefig(outpath, bbox_inches='tight')
 
plt.show()

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值