• 【Boxplot】


    1. # -*- coding: utf-8 -*-
    2. """
    3. Created on Tue Oct 24 09:30:19 2023
    4. @author: Administrator
    5. """
    6. # -*- coding: utf-8 -*-
    7. """
    8. Created on Mon Oct 23 19:53:51 2023
    9. @author: Administrator
    10. """
    11. # -*- coding: utf-8 -*-
    12. """
    13. Created on Thu Jun 22 15:16:16 2023
    14. @author: Administrator
    15. """
    16. import os
    17. import pandas as pd
    18. import numpy as np
    19. import matplotlib.pyplot as plt
    20. from matplotlib.font_manager import FontProperties
    21. plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体或其他支持的字体
    22. plt.rcParams['savefig.dpi'] = 600 # 图片像素
    23. plt.rcParams['figure.dpi'] = 600
    24. # 读取CSV文件
    25. data = pd.read_csv(r'F:\Fianl paper\BoxPlot\666.csv')
    26. # 将每一列转换为numpy数组并生成箱式图(去除空值)
    27. num_rows = 5
    28. num_columns = 12
    29. # 设置新的横坐标轴标签
    30. x_labels = ['水体', '植被', '农业用地', '建设用地'] * 3
    31. print(data)
    32. # 设置新罗马字体zhi'bei
    33. font = FontProperties(family='serif')
    34. # 创建三行十六列的子图网格
    35. fig, axs = plt.subplots(num_rows, num_columns, figsize=(20, 20), sharex='col', sharey='row')
    36. # 调整子图间距和边距
    37. fig.subplots_adjust(wspace=0.001, hspace=0.15) # 调整水平和垂直间距
    38. # 添加标签行
    39. axs[0, 0].text(1.9, 1.2, '六月', transform=axs[0, 0].transAxes,
    40. ha='center', va='center', fontsize=22)
    41. axs[0, 4].text(1.9, 1.2, '七月', transform=axs[0, 4].transAxes,
    42. ha='center', va='center', fontsize=22)
    43. axs[0, 8].text(1.9, 1.2, '八月', transform=axs[0, 8].transAxes,
    44. ha='center', va='center', fontsize=22)
    45. # 添加温度标签
    46. fig.text(0.085, 0.5, '温度(℃)', transform=fig.transFigure,
    47. ha='center', va='center', fontsize=22, rotation=90)
    48. # 添加年份标签
    49. year_labels = ['1999', '2005', '2011','2017','2022']
    50. for i in range(num_rows):
    51. # 在最后一列的每个子图上添加年份标签
    52. axs[i, num_columns - 1].text(1.39, 0.5, year_labels[i],
    53. transform=axs[i, num_columns - 1]
    54. .transAxes,
    55. ha='center', va='center', fontsize=22, rotation=90)
    56. # 绘制箱式图
    57. for i in range(num_rows):
    58. for j in range(num_columns):
    59. # 计算当前子图的索引
    60. index = i * num_columns + j
    61. if index < len(data.columns):
    62. # 将当前列转换为numpy数组并去除空值
    63. column_array = data.iloc[:, index].dropna().values
    64. # 绘制箱式图
    65. bp = axs[i, j].boxplot([column_array], positions=[0], widths=0.5, patch_artist=True)
    66. # 隐藏边框
    67. axs[i, j].spines['top'].set_visible(False)
    68. axs[i, j].spines['right'].set_visible(False)
    69. axs[i, j].spines['bottom'].set_visible(False)
    70. axs[i, j].spines['left'].set_visible(False)
    71. # 设置特定箱式图的坐标轴样式
    72. if j % (num_columns // 3) == 0:
    73. axs[i, j].spines['left'].set_visible(True)
    74. axs[i, j].spines['left'].set_linewidth(2)
    75. axs[i, j].spines['left'].set_color('black')
    76. if i == num_rows - 1:
    77. axs[i, j].spines['bottom'].set_visible(True)
    78. axs[i, j].spines['bottom'].set_linewidth(2)
    79. axs[i, j].spines['bottom'].set_color('black')
    80. # 设置横坐标轴标签
    81. axs[i, j].set_xticks([0])
    82. axs[i, j].set_xticklabels([x_labels[j]], rotation=0, ha='center', fontsize=22) # 调整横坐标轴标签位置为居中
    83. axs[i, j].tick_params(axis='y', labelsize=22)
    84. # 设置箱体填充颜色
    85. colors = ['darkblue', 'darkgreen', 'pink', 'darkred']
    86. box = bp['boxes'][0]
    87. box.set(facecolor=colors[j % (num_columns // 3)])
    88. # 绘制每组四个箱式图的平均值再平均的灰色加粗线和标注
    89. for i in range(num_rows):
    90. for j in range(0, num_columns, num_columns // 3):
    91. mean_values = [] # 存储每组四个箱式图的平均值
    92. for k in range(num_columns // 3):
    93. column_array = data.iloc[:, i * num_columns + j + k].dropna().values
    94. mean_values.append(np.mean(column_array))
    95. mean_line = np.mean(mean_values) # 计算每组四个箱式图的平均值再平均
    96. # 绘制灰色实线并设置长度
    97. axs[i, j].axhline(mean_line, color='gray', linestyle='-', linewidth=3, xmin=0.02, xmax=0.98)
    98. axs[i, j + 1].axhline(mean_line, color='gray', linestyle='-', linewidth=3, xmin=0.02, xmax=0.98)
    99. axs[i, j + 2].axhline(mean_line, color='gray', linestyle='-', linewidth=3, xmin=0.02, xmax=0.98)
    100. axs[i, j + 3].axhline(mean_line, color='gray', linestyle='-', linewidth=3, xmin=0.02, xmax=0.98)
    101. # 标注平均值的数值
    102. box_height = axs[i, j].get_ylim()[1] - axs[i, j].get_ylim()[0]
    103. axs[i, j].text(1.9, 1.06, f'{mean_line:.2f}℃', transform=axs[i, j].transAxes,
    104. ha='center', va='center', fontsize=16, bbox=dict(facecolor='white', edgecolor='gray', boxstyle='round'))
    105. for i in range(num_rows):
    106. for j in range(num_columns):
    107. # 计算当前子图的索引
    108. index = i * num_columns + j
    109. if index < len(data.columns):
    110. # 显示横坐标轴
    111. axs[i, j].xaxis.set_visible(True)
    112. axs[i, j].tick_params(axis='x', which='both', bottom=False, top=False, color='black', width=2)
    113. # 显示纵坐标轴
    114. axs[i, j].yaxis.set_visible(True)
    115. axs[i, j].tick_params(axis='y', which='both', left=False, right=False)
    116. else:
    117. # 隐藏多余的子图
    118. axs[i, j].axis('off')
    119. # 显示图形
    120. plt.show()
    121. plt.savefig(os.path.join(r'F:\Fianl paper','箱式图'))

  • 相关阅读:
    前端 - Map对象详解
    centos7云服务器安装nginx记录
    Chrome浏览器怎么清理单个页面缓存,简单实用
    谷粒商城 (二十八) --------- 仓储服务 API 仓库管理
    Nginx —— Win下搭建http-flv服务,使用FFmpeg/Tomcat对http推拉流
    一起Talk Android吧(第四百一十八回:制作时钟)
    03初始Docker
    STM32CubeMX教程29 USB_HOST - 使用FatFs文件系统读写U盘
    SEO的优化教程(百度SEO的介绍和优化)
    String类的详解
  • 原文地址:https://blog.csdn.net/qq_58291072/article/details/134007541