# -*- 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()
【毕业论文】BoxPlot
于 2023-06-22 16:16:34 首次发布