# 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()
标签:plt,组合,df,matplotlib,import,数据,day
From: https://www.cnblogs.com/wxyz94/p/16911547.html