笔记:绘图进阶

主要功能:

  1. 双坐标轴
  2. 多子图共用一个横坐标
  3. 横坐标时间刻度设置(简便方法)
  4. 自定义时间坐标轴起止时间
# -*- coding: utf-8 -*-

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

if __name__ == '__main__':
    # 风速
    data_df = pd.read_excel(r'G:\20231021\3\data.xlsx', sheet_name='风', na_values=['VRB', 'C'])
    data_arr = np.array(data_df)
    wind_d = data_arr[:, range(0, 48, 2)].flatten()
    wind_v = data_arr[:, range(1, 48, 2)].flatten()
    # 气温
    data_df = pd.read_excel(r'G:\20231021\3\data.xlsx', sheet_name='气温', header=None)
    t_arr = np.array(data_df).flatten()
    # 露点温度
    data_df = pd.read_excel(r'G:\20231021\3\data.xlsx', sheet_name='露点温度', header=None)
    dewt_arr = np.array(data_df).flatten()
    # 能见度
    data_df = pd.read_excel(r'G:\20231021\3\data.xlsx', sheet_name='能见度', header=None)
    vis_arr = np.array(data_df).flatten()
    # 气压
    data_df = pd.read_excel(r'G:\20231021\3\data.xlsx', sheet_name='气压', header=None)
    p_arr = np.array(data_df).flatten()

    # 画图
    x = pd.date_range(start='201711020100', end='201712020000', freq='H')  # 生成时间序列(基于原始世界时转为北京时)
    # 创建一个包含4个子图的画布
    fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4, ncols=1, figsize=(8, 10), sharex=True)

    # 在第一个子图上画图
    ax1.plot(x, wind_v, 'b')
    ax1.set_ylabel('wind/(m/s)')
    # 创建第一个子图的右侧纵坐标轴
    ax1_right = ax1.twinx()
    ax1_right.plot(x, vis_arr, 'r')  # 替换 wind_v_right 为您的右侧纵坐标数据
    ax1_right.set_ylabel('vis/(m)')  # 或者您想要的任何右侧纵坐标标签

    # 在第二个子图上画图
    ax2.plot(x, t_arr, 'b')
    ax2.set_ylabel('t(℃)')
    # 创建第2个子图的右侧纵坐标轴
    ax2_right = ax2.twinx()
    ax2_right.plot(x, vis_arr, 'r')  # 替换 wind_v_right 为您的右侧纵坐标数据
    ax2_right.set_ylabel('vis/(m)')  # 或者您想要的任何右侧纵坐标标签

    # 在第三个子图上画图
    ax3.plot(x, t_arr - dewt_arr, 'b')
    ax3.set_ylabel('t-td/(℃)')
    # 创建第3个子图的右侧纵坐标轴
    ax3_right = ax3.twinx()
    ax3_right.plot(x, vis_arr, 'r')  # 替换 wind_v_right 为您的右侧纵坐标数据
    ax3_right.set_ylabel('vis/(m)')  # 或者您想要的任何右侧纵坐标标签

    # 在第4个子图上画图
    ax4.plot(x, p_arr, 'b')
    ax4.set_ylabel('P/(0.1hPa)')
    ax4.set_xlabel('Time')
    # 创建第4个子图的右侧纵坐标轴
    ax4_right = ax4.twinx()
    ax4_right.plot(x, vis_arr, 'r')  # 替换 wind_v_right 为您的右侧纵坐标数据
    ax4_right.set_ylabel('vis/(m)')  # 或者您想要的任何右侧纵坐标标签
    ax4.set_xlim([mdates.date2num(np.datetime64('2017-11-19 21:00:00')),
                  mdates.date2num(np.datetime64('2017-11-21 04:00:00'))])
    ax4.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M:%S'))  # 设置x轴标签的格式为日期时间格式
    ax4.xaxis.set_major_locator(mdates.HourLocator())  # 设置x轴标签的间隔为每天一个标签

    ax4.tick_params(axis='x', rotation=90)  # 旋转x轴标签90度

    # 显示画布
    plt.tight_layout()  # 自动调整子图间距,以适应子图大小和位置的变化
    plt.show()

笔记:绘图进阶_第1张图片

你可能感兴趣的:(笔记)