示例页面

python-双y轴组合图

# 1.导包、做基础设置
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import matplotlib.dates as mdate
from matplotlib import ticker
from datetime import datetime


%matplotlib inline

# plt.style.use('ggplot') # 修改图表样式
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # 解决中文显示问题


# 2.数据导入并做处理
df = pd.read_excel('/Users/wang/Desktop/data.xlsx'
                     , index_col=0
                     , keep_default_na=0)
df_day = df[df['district']=='整体']
df_day['all_uv_growth_rate'] = df_day['all_uv'].pct_change(periods=1).fillna(0).apply(lambda x: format(x, '.2%'))

# 3.创建数据标签函数
# 添加数据标签函数
def autolabel(x, y, axes):
"""因为是组合图,柱状图是绝对值数据,折线图是百分比数据,数据格式做了不同判断设置"""
    for a, b in zip(x, y):
        # 如果数据都<1,用百分数展示
        if (y<1).all():
            label = "{:.2%}".format(b)
        else:
            label = '%s' % b
        axes.annotate(label, xy=(a,b), xytext=(-20,3), textcoords='offset points')


# 4. 绘图
fig = plt.figure(figsize=(20,9))
ax1 = fig.add_subplot(1,1,1)
ax1.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))
ax1.bar(df_day.index, df_day['all_uv'], color='g', label='全量用户')

# 设置轴范围
ax1.set_ylim([181000, 188000])

# 设置为共用X轴的双y轴图表
ax2 = ax1.twinx()
ax2.plot(df_day.index, df_day['active_rate'], color='b', label='活跃率')

# 轴标签
ax1.set_xlabel('日期')
ax1.set_ylabel('全量用户')
ax2.set_ylabel('活跃率')

# 折线图添加数据标签
autolabel(df_day.index, df_day['active_rate'], ax2)
# autolabel(df_day.index, df_day['all_uv'], ax1)

# 第二个y轴数据刻度显示为百分数
ax2.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1,decimals=0))

# 设置图形标题
ax1.set_title('XXXX注册用户及活跃率指标')

# 图例
ax1.legend(loc=2)
ax2.legend(loc=1)
plt.show()

image

posted @ 2022-11-21 15:27  没有风格的Wang  阅读(458)  评论(0编辑  收藏  举报