如何使用MatPlotLib绘制出具有两个 Y 轴的曲线图?

举报
tsinghuazhuoqing 发表于 2022/02/08 00:11:58 2022/02/08
【摘要】 简 介: 本文给出了利用Matplotlib中的 twinx() 完成同一个图表中绘制具有两个 Y-轴的曲线。绘制每一个曲线的方法与普通的Plot没有什么两样。 关键词: matplotlib,...

简 介: 本文给出了利用Matplotlib中的 twinx() 完成同一个图表中绘制具有两个 Y-轴的曲线。绘制每一个曲线的方法与普通的Plot没有什么两样。

关键词 matplotlib双Y轴

两个Y轴
目 录
Contents
为什么需要
两个Y轴?
绘制示例
总 结
补充资源

 

§01 个Y轴


1.1 为什么需要两个Y轴?

  在有的时候,需要在一张图上绘制出具有两个Y轴的曲线,这是为:

  • 绘制的两个数据曲线具有不同的物理量纲和取值范围,如果使用一个Y轴的比例,这两个曲线在尺度相差过大,使得其中一个分辨不清楚;
  • 绘制在一起主要为便于对比两个曲线,相比绘制在两个子图中更加明显。

  在博文 How to Create a Matplotlib Plot with Two Y Axes 给出了绘制方法描述,下面进行测试以备之后使用之需。

1.2 绘制示例

  使用 twinx() 函数绘制带有两个Y轴的曲线图非常容易。下面 示例演示如何是踹死 Matplotlib
  绘制带有两个 Y 轴的图标。

1.2.1 例程:创建带有两个Y轴的Matplotlib

  首先,为了演示,假设我们有两个pandas DataFrames:

import pandas as pd

#create DataFrames
df1 = pd.DataFrame({'year': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                    'sales': [14, 16, 19, 22, 24, 25, 24, 24, 27, 30]})

df2 = pd.DataFrame({'year': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                    'leads': [4, 4, 4, 5, 4, 5, 7, 8, 5, 3]})

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
df1:    year  sales
0     1     14
1     2     16
2     3     19
3     4     22
4     5     24
5     6     25
6     7     24
7     8     24
8     9     27
9    10     30
df2:    year  leads
0     1      4
1     2      4
2     3      4
3     4      5
4     5      4
5     6      5
6     7      7
7     8      8
8     9      5
9    10      3

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

  这两个数据都有 “year” 变量,从1 变化到 10, 第一个数据是表示每年的销售总额,第二个则显示每一年的销售总额。

  下面的代码可以创建一个Matplotlib的图表来显示两个数据,具有两个 Y 轴分别表示两个数据曲线。

import matplotlib.pyplot as plt

#define colors to use
col1 = 'steelblue'
col2 = 'red'

#define subplots
fig,ax = plt.subplots()

#add first line to plot
ax.plot(df1.year, df1.sales, color=col1)

#add x-axis label
ax.set_xlabel('Year', fontsize=14)

#add y-axis label
ax.set_ylabel('Sales', color=col1, fontsize=16)

#define second y-axis that shares x-axis with current plot
ax2 = ax.twinx()

#add second line to plot
ax2.plot(df2.year, df2.leads, color=col2)

#add second y-axis label
ax2.set_ylabel('Leads', color=col2, fontsize=16)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

▲ 图1.2.1 绘制的图表结果

▲ 图1.2.1 绘制的图表结果

  左边的 y-轴显示了每一年总销售量;右边的y-轴显示销售的潜在客户数据。蓝线表示的每年的销售总额,红色则表示每年的销售客户。

1.2.2 改变曲线特性

  可以使用 markerlinewidth 参数来方便改变图表中曲线的外观。

import matplotlib.pyplot as plt

#define colors to use
col1 = 'steelblue'
col2 = 'red'

#define subplots
fig,ax = plt.subplots()

#add first line to plot
ax.plot(df1.year, df1.sales, color=col1, marker='o', linewidth=3)

#add x-axis label
ax.set_xlabel('Year', fontsize=14)

#add y-axis label
ax.set_ylabel('Sales', color=col1, fontsize=16)

#define second y-axis that shares x-axis with current plot
ax2 = ax.twinx()

#add second line to plot
ax2.plot(df2.year, df2.leads, color=col2, marker='o', linewidth=3)

#add second y-axis label
ax2.set_ylabel('Leads', color=col2, fontsize=16)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

▲ 图1.2.2 使用曲线marker,linewidth进行修改曲线特性的图表

▲ 图1.2.2 使用曲线marker,linewidth进行修改曲线特性的图表

  上图中使用 marker=‘o’ 使得单个数据点更加凸显。

 

  结 ※


  文给出了利用Matplotlib中的 twinx() 完成同一个图表中绘制具有两个 Y-轴的曲线。绘制每一个曲线的方法与普通的Plot没有什么两样。

▲ 图2.1 增加Grid的形式

▲ 图2.1 增加Grid的形式

col1 = 'steelblue'
col2 = 'red'

plt.figure(figsize=(10,6))
plt.grid(True)
fig,ax = plt.subplots()
ax.plot(df1.year, df1.sales, color=col1, marker='o', linewidth=3)
ax.set_xlabel('Year', fontsize=14)
ax.set_ylabel('Sales', color=col1, fontsize=14)
plt.grid(True)

ax2 = ax.twinx()
ax2.plot(df2.year, df2.leads, color=col2, marker='o', linewidth=3)
ax2.set_ylabel('Leads', color=col2, fontsize=16)

plt.tight_layout()
plt.savefig(r"d:\temp\figure1.jpg")
plt.close()
tspshowimage(image=r"d:\temp\figure1.jpg")

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.1 补充资源

  下面的指导博文给出更多其他Matplotlib有用的特性。

补充内容

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *

t = linspace(0, 20, 1000)
sint = sin(t)
cost = cos(t)

col1 = 'steelblue'
col2 = 'red'
plt.figure(figsize=(10,6))
plt.plot(t, sint, color=col1, linewidth=1)
plt.xlabel('Time', fontsize=14)
plt.ylabel('Value', color=col1, fontsize=14)
plt.grid(True)
ax2 = plt.twinx()
ax2.plot(t, cost, color=col2, linewidth=1)
ax2.set_ylabel('Value', color=col2, fontsize=16)
plt.tight_layout()
plt.savefig('/home/aistudio/stdout.jpg')
plt.show()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

▲ 图2.2.1 绘制示例图

▲ 图2.2.1 绘制示例图


■ 相关文献链接:

● 相关图表链接:

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/122781545

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。