技巧 | Python画图辅助标注(多子图共坐标轴)

简介: 技巧 | Python画图辅助标注(多子图共坐标轴)

大家好,我是欧K。我们在用matplotlib绘图时,经常遇到多子图以及辅助标注的情况,本期给大家介绍一下matplotlib中绘制辅助线的两个函数axvline、axhline希望对你有所帮助。

1. 数据处理


1.1 导入模块

from pylab import mpl
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.ticker as ticker

1.2 数据指标

读取数据:

mpl.rcParams['axes.unicode_minus']=False
mpl.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_csv('data.csv')
df.head()

结果:


指标:V04001: 年V04002: 月V04003: 日V13305: 20-20时降水量V10004_701: 平均气压 V12001_701: 平均气温V13003_701: 平均相对湿度


1.3 日期处理


选取2020.1.10--2020.3.19日期的数据(可自行调整)

# 选择时间范围
a = df[(df['V04001']==2020)&(df['V04002']==1)&(df['V04003']==10)].index.tolist()
b = df[(df['V04001']==2020)&(df['V04002']==3)&(df['V04003']==19)].index.tolist()
df1 = df.iloc[a[0]:b[0]+1,:]
# Temperature
temperature = df1['V12001_701'].values
# Humidity
humidity = df1['V13003_701'].values
mon = df1['V04002'].astype(str).values.tolist()
day = df1['V04003'].astype(str).values.tolist()
# 横坐标年月日
date = []
for i in range(len(mon)):
    date.append(day[i].rjust(2,'0') + '/' + mon[i].rjust(2,'0') + '/' + '2020')

2. 画图


2.1 温度-湿度图

代码:

# figsize设置整个图布大小
fig, ax = plt.subplots(figsize=(16,8))
ax_sub = ax.twinx()
# 绘图
l1, = ax.plot(date, temperature, 'r-', label='temperature')
l2, = ax_sub.plot(date, humidity, 'g-', label='humidity')
# 放置图例 根据loc的取值(1,2,3,4),放置的位置不一样
plt.legend(handles=[l1, l2], labels=['temperature', 'humidity'], loc=2)
ax.set_ylabel('摄氏度(℃)')
ax_sub.set_ylabel('百分率(%)')
# 横坐标倾斜角度 rotation
ax.tick_params( axis='x',rotation = 45)
plt.show()

效果:2.2 增加辅助线、调整时间密度


代码

# figsize设置整个图布大小
fig, ax = plt.subplots(figsize=(16,8))
ax_sub = ax.twinx()
# 绘图
l1, = ax.plot(date, temperature, 'r-', label='temperature')
l2, = ax_sub.plot(date, humidity, 'g-', label='humidity')
# 放置图例 根据loc的取值(1,2,3,4),放置的位置不一样
plt.legend(handles=[l1, l2], labels=['temperature', 'humidity'], loc=2)
ax.set_ylabel('摄氏度(℃)')
ax_sub.set_ylabel('百分率(%)')
# 横坐标倾斜角度 rotation
ax.tick_params( axis='x',rotation = 45)
# MultipleLocator 调整x轴显示标签的密度
ax.xaxis.set_major_locator(ticker.MultipleLocator(8))
plt.axvline('23/01/2020',linestyle='--',color='black')
plt.axvline('07/02/2020',linestyle='--',color='black')
plt.axvline('20/02/2020',linestyle='--',color='black')
plt.axvline('05/03/2020',linestyle='--',color='black')
plt.axhline(humidity.mean(),linestyle='--',color='purple')
# y P1标签纵坐标高度
y = 80
plt.text(x='15/01/2020', y=y, s='P1', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='31/01/2020', y=y, s='P2', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='13/02/2020', y=y, s='P3', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='27/02/2020', y=y, s='P4', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='14/03/2020', y=y, s='P5', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.show()

效果:

2.3 增加子图


代码

# figsize设置整个图布大小
fig, ax = plt.subplots(2,1,figsize=(16,8))
ax_sub = ax[0].twinx()
# 绘图
l1, = ax[0].plot(date, temperature, 'r-', label='temperature')
l2, = ax_sub.plot(date, humidity, 'g-', label='humidity')
# 放置图例 根据loc的取值(1,2,3,4),放置的位置不一样
plt.legend(handles=[l1, l2], labels=['temperature', 'humidity'], loc=2)
ax[0].set_ylabel('摄氏度(℃)')
ax_sub.set_ylabel('百分率(%)')
ax[0].tick_params( axis='x')
# MultipleLocator 调整x轴显示标签的密度
ax[0].xaxis.set_major_locator(ticker.MultipleLocator(8))
plt.axvline('23/01/2020',linestyle='--',color='black')
plt.axvline('07/02/2020',linestyle='--',color='black')
plt.axvline('20/02/2020',linestyle='--',color='black')
plt.axvline('05/03/2020',linestyle='--',color='black')
plt.axhline(humidity.mean(),linestyle='--',color='purple')
# y P1标签纵坐标高度
y = 80
plt.text(x='15/01/2020', y=y, s='P1', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='31/01/2020', y=y, s='P2', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='13/02/2020', y=y, s='P3', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='27/02/2020', y=y, s='P4', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='14/03/2020', y=y, s='P5', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
# Precipitation
precipitation = df1['V13305'].values
# Pressure
pressure = df1['V10004_701'].values
ax[1].plot(date, pressure, 'r-', label='precipitation')
ax_sub= ax[1].twinx()
ax_sub.bar(date, precipitation, color='steelblue', label='pressure', alpha=0.8)
# 图例
handles1, labels1 = ax[1].get_legend_handles_labels()
handles2, labels2 = ax_sub.get_legend_handles_labels()
plt.legend(handles1 + handles2, labels2+labels1 , loc=2)
ax[1].set_ylabel('降水(mm)')
ax_sub.set_ylabel('气压(pa)')
ax[1].tick_params( axis='x')
ax[1].xaxis.set_major_locator(ticker.MultipleLocator(8))
plt.axvline('23/01/2020',linestyle='--',color='orange')
plt.axvline('07/02/2020',linestyle='--',color='orange')
plt.axvline('20/02/2020',linestyle='--',color='orange')
plt.axvline('05/03/2020',linestyle='--',color='orange')
plt.axhline(15,linestyle='--',color='purple')
y = 25
plt.text(x='15/01/2020', y=y, s='P1', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='31/01/2020', y=y, s='P2', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='13/02/2020', y=y, s='P3', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='27/02/2020', y=y, s='P4', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.text(x='14/03/2020', y=y, s='P5', ha='center', va='baseline', fontdict=dict(fontsize=12, color='black', family='monospace', weight='bold'))
plt.tight_layout()

效果:



完。

END


以上就是本期为大家整理的全部内容了,赶快练习起来吧,喜欢的朋友可以点赞、点在看也可以分享让更多人知道


相关文章
|
6天前
|
数据可视化 API Python
画图实战-Python实现某产品全年销量数据多种样式可视化
画图实战-Python实现某产品全年销量数据多种样式可视化
40 0
|
6天前
|
算法 Python
关联规则算法及其画图(python
关联规则算法及其画图(python
30 2
|
6天前
|
自然语言处理 算法 Java
基于Python实现四大名著章节标注汉语拼音
基于Python实现四大名著章节标注汉语拼音
29 0
|
6天前
|
Python
python 海龟画图tutle螺旋线
python 海龟画图tutle螺旋线
39 0
|
6天前
|
机器学习/深度学习 人工智能 文字识别
Python常用验证码标注和识别(需求分析和实现思路)
Python常用验证码标注和识别(需求分析和实现思路)
69 0
|
6天前
|
存储 Python
【python】——超市管理系统和用turtle动态画图(爱心和魔幻曲线)
【python】——超市管理系统和用turtle动态画图(爱心和魔幻曲线)
46 0
【python】——超市管理系统和用turtle动态画图(爱心和魔幻曲线)
|
6天前
|
机器学习/深度学习 JSON 自然语言处理
python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)
python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)
51 0
|
6天前
|
自然语言处理 算法 Java
基于Python第三方插件实现西游记章节标注汉语拼音
基于Python第三方插件实现西游记章节标注汉语拼音
17 0
|
6天前
|
Python
python画图中文乱码
python画图中文乱码
18 0
|
6天前
|
机器学习/深度学习 数据挖掘 Python
【Python机器学习】标注任务与序列问题讲解(图文解释)
【Python机器学习】标注任务与序列问题讲解(图文解释)
34 0