从零开始学matplotlib画图(六): 双轴图

在工作中,我们经常会遇到需要同时展示两种指标的需求。如果想要简单地实现这样的需求,我们完全可以将两个指标在两张图中展示。

然而我们常常需要将两个极为相关或者同样重要的指标放在一起来观察,比如说,有一家内容类公司,需要观察过去一年产品日活以及内容整体点击率的趋势,他们既不想日活增长点击率降低,更不想单纯地提高点击率但用户却负增长。这种情况下,我们希望将日活(DAU)和点击率(CTR)放在一起来对比展示。

但是这样就不得不面对这样一个问题,那就是DAU和CTR的数值量级是不一样的。我们先假设这个产品的DAU是百万级别的,至于CTR,毫无疑问,它是一个在0到1之间波动的小数。如果我们将他们放在同一刻度下,毫无疑问,点击率的线图会是一条紧紧贴着x轴的线,完全看不出任何趋势。


欢迎大家关注我的个人博客【数洞】 【备用站】

因此,我们需要将他们放在不同的坐标系下来展示:

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
import numpy as np

# 生成数据
month = np.linspace(1, 12, 12)
dau = np.random.randint(200, 300, 12)
ctr = np.random.randint(8, 20, 12) / 100

# 画图
fig, ax1 = plt.subplots(figsize = (10, 5), facecolor='white')

# 左轴
ax1.bar(month, dau, color='g', alpha=0.5)
ax1.set_xlabel('月份')
ax1.set_ylabel('日活(万)')

# 右轴
ax2 = ax1.twinx()
ax2.plot(month, ctr, '-or')
ax2.set_ylabel('点击率')
ax2.set_ylim(0, 0.2)


# 将点击率坐标轴以百分比格式显示
def to_percent(temp, position):
   return '%2.1f'%(100*temp) + '%'
plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percent))

# 标题
plt.title('2017年XXX日活及点击率趋势')
plt.show()

可以看到,这样我们就将两个不同量级的数据完美地展现在同一张图中了。我们还通过一个函数将右侧的y轴调整成了按照百分比样式展示。

在这里,我们主要使用了twinx()方法,它帮助我们复制了x轴,同时允许我们接下来在右侧的y轴上作图。可能有些朋友已经想到了,twiny()方法会帮助我们做一个y轴数据相同,x轴数据不同且量级差异较大的图。

你可能感兴趣的:(一图胜千言,Python可视化教程)