【毕业论文】BoxPlot

# -*- coding: utf-8 -*-
"""
Created on Thu Jun 22 15:16:16 2023

@author: Administrator
"""
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为黑体或其他支持的字体
plt.rcParams['savefig.dpi'] = 600  # 图片像素
plt.rcParams['figure.dpi'] = 600

# 读取CSV文件
data = pd.read_csv(r'F:\Fianl paper\BoxPlot\AA.csv')

# 将每一列转换为numpy数组并生成箱式图(去除空值)
num_rows = 3
num_columns = 16

# 设置新的横坐标轴标签
x_labels = ['水体', '绿地', '农业用地', '建设用地'] * 4

# 设置新罗马字体
font = FontProperties(family='serif')

# 创建三行十六列的子图网格
fig, axs = plt.subplots(num_rows, num_columns, figsize=(21, 12), sharex='col', sharey='row')

# 调整子图间距和边距
fig.subplots_adjust(wspace=0.01, hspace=0.15)  # 调整水平和垂直间距

# 添加标签行

axs[0, 0].text(1.9, 1.2, '五月', transform=axs[0, 0].transAxes,
               ha='center', va='center', fontsize=22)
axs[0, 4].text(1.9, 1.2, '六月', transform=axs[0, 4].transAxes,
               ha='center', va='center', fontsize=22)
axs[0, 8].text(1.9, 1.2, '七月', transform=axs[0, 8].transAxes,
               ha='center', va='center', fontsize=22)
axs[0, 12].text(1.9, 1.2, '八月', transform=axs[0, 12].transAxes,
                ha='center', va='center', fontsize=22)

# 添加温度标签
fig.text(0.09, 0.5, '温度(℃)', transform=fig.transFigure,
         ha='center', va='center', fontsize=22, rotation=90)
# 添加年份标签
year_labels = ['1999', '2013', '2021']
for i in range(num_rows):
    # 在最后一列的每个子图上添加年份标签
    axs[i, num_columns - 1].text(1.39, 0.5, year_labels[i], transform=axs[i, num_columns - 1].transAxes,
                                 ha='center', va='center', fontsize=22, rotation=90)


# 绘制箱式图
for i in range(num_rows):
    for j in range(num_columns):
        # 计算当前子图的索引
        index = i * num_columns + j

        if index < len(data.columns):
            # 将当前列转换为numpy数组并去除空值
            column_array = data.iloc[:, index].dropna().values

            # 绘制箱式图
            bp = axs[i, j].boxplot([column_array], positions=[0], widths=0.5, patch_artist=True)

            # 隐藏边框
            axs[i, j].spines['top'].set_visible(False)
            axs[i, j].spines['right'].set_visible(False)
            axs[i, j].spines['bottom'].set_visible(False)
            axs[i, j].spines['left'].set_visible(False)

            # 设置特定箱式图的坐标轴样式
            if j % (num_columns // 4) == 0:
                axs[i, j].spines['left'].set_visible(True)
                axs[i, j].spines['left'].set_linewidth(2)
                axs[i, j].spines['left'].set_color('black')

            if i == num_rows - 1:
                axs[i, j].spines['bottom'].set_visible(True)
                axs[i, j].spines['bottom'].set_linewidth(2)
                axs[i, j].spines['bottom'].set_color('black')

            # 设置横坐标轴标签
            axs[i, j].set_xticks([0])
            axs[i, j].set_xticklabels([x_labels[j]], rotation=20, ha='center', fontsize=20)  # 调整横坐标轴标签位置为居中
            axs[i, j].tick_params(axis='y', labelsize=20)

            # 设置箱体填充颜色
            colors = ['darkblue', 'darkgreen', 'yellow', 'darkred']
            box = bp['boxes'][0]
            box.set(facecolor=colors[j % (num_columns // 4)])

         
# 绘制每组四个箱式图的平均值再平均的灰色加粗线和标注
for i in range(num_rows):
    for j in range(0, num_columns, num_columns // 4):
        mean_values = []  # 存储每组四个箱式图的平均值
        for k in range(num_columns // 4):
            column_array = data.iloc[:, i * num_columns + j + k].dropna().values
            mean_values.append(np.mean(column_array))
        mean_line = np.mean(mean_values)  # 计算每组四个箱式图的平均值再平均

        # 绘制灰色实线并设置长度
        axs[i, j].axhline(mean_line, color='gray', linestyle='-', linewidth=3, xmin=0.02, xmax=0.98)
        axs[i, j + 1].axhline(mean_line, color='gray', linestyle='-', linewidth=3, xmin=0.02, xmax=0.98)
        axs[i, j + 2].axhline(mean_line, color='gray', linestyle='-', linewidth=3, xmin=0.02, xmax=0.98)
        axs[i, j + 3].axhline(mean_line, color='gray', linestyle='-', linewidth=3, xmin=0.02, xmax=0.98)

        # 标注平均值的数值
        box_height = axs[i, j].get_ylim()[1] - axs[i, j].get_ylim()[0]
        axs[i, j].text(1.9, 1.06, f'{mean_line:.2f}℃', transform=axs[i, j].transAxes,
                       ha='center', va='center', fontsize=14, bbox=dict(facecolor='white', edgecolor='gray', boxstyle='round'))

for i in range(num_rows):
    for j in range(num_columns):
        # 计算当前子图的索引
        index = i * num_columns + j

        if index < len(data.columns):
            # 显示横坐标轴
            axs[i, j].xaxis.set_visible(True)
            axs[i, j].tick_params(axis='x', which='both', bottom=False, top=False, color='black', width=2)

            # 显示纵坐标轴
            axs[i, j].yaxis.set_visible(True)
            axs[i, j].tick_params(axis='y', which='both', left=False, right=False)
        else:
            # 隐藏多余的子图
            axs[i, j].axis('off')


plt.savefig(os.path.join(r'F:\Fianl paper','箱式图.jpg'))

# 显示图形
plt.show()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值