- 绘制sin(x)函数
- 绘制出2018年各地区销售总额及同比增长率
前面我们讲述了双y轴坐标系和改变画布的默认显示,接下来我们讲解两个实际中的例子。先来下载习题资源
绘制sin(x)函数
第一道西替我们先绘制sin(x)函数一个周期的形状,要求去掉边框以及x、y轴标签显示。
首先,绘制sin函数可以借助numpy库来实现,因为要绘制一个周期,x的取值应该为[0,2π]。但是计算机没办法进行连续取值,只能把一些离散的点用线段连接起来。具体到这道题,我们就需要在0到2π之间均匀取到若干个值,取值越多,画出来的图像越接近真实。x的取值可以使用numpy中的linspace()方法实现:
import numpy as np
linspace(start, stop, num=50)
其中,start代表x取值范围的左端点,stop则代表右端点,num代表均匀取值的数量,默认为50。知道了这些方法,就能解决这个问题了:
import numpy as np
import matplotlib.pyplot as plt
# 在指定的间隔内返回均匀间隔的数字
x = np.linspace(0,2*np.pi,256) # 从0到2π均匀获取256个点
# 正弦函数
y = np.sin(x)
#画图,使用不同的颜色和线条
plt.plot(x,y,color='r',linewidth=1)
# 获取当前画布
ax = plt.gca()
# 将图型的包围线全部设置为无
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('none')
ax.spines['left'].set_color('none')
# 设置不显示坐标轴刻度
plt.xticks([])
plt.yticks([])
plt.show()
绘制出2018年各地区销售总额及同比增长率
习题资源中提供了某电商超市2016到2019年部分销售数据,我们以柱状图的形式绘制2018年各地区销售额,然后以折线图形式绘制2018年各地区销量较2017年的增长率。
因为需要绘制的两组数据数量和单位均不同,应采用双y轴法进行绘制。我们先将订单日期一列设置为行索引,然后找到2017和2018两年的数据,依据地区分组,并求出各地区销售额之和,设置x轴显示各地区名称,以柱状图的形式绘制2018年的销售额;然后用2018年各地区销售额减掉2017年对应数据,并用该值除以2017年数据,然后绘制成折线图。
下面给大家奉上程序,记得注意看注释:
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=10)
# 获取数据
data = pd.read_excel('Commerce.xls')
data.index = data['订单日期']
# 求取17,18年的各地区总销售额数据
data18=data.loc['2018'].groupby('地区').sum()['销售额']
data17=data.loc['2017'].groupby('地区')['销售额'].sum()
# 以列表形式储存17,18年各地区销售额备用
fig18,fig17=data18.tolist(),data17.tolist()
# 存储data18的列索引,作为x轴标签
ind=data18.index.tolist() # 由于data17和data18列索引相同,所以只存储一个
rise=(data18-data17)/data17 # 两个series数据可以直接对其内容进行四则运算
ax = plt.figure().add_subplot(111) # 准备绘制双y轴坐标系
pillar=ax.bar(range(len(ind)),height=fig18,width=0.3,label='18年数据')
# 给x轴添加标签,必须放置在合并x轴之前
plt.xticks(range(len(ind)),ind,fontproperties=my_font)
ax2=ax.twinx() # 合并x轴
lin=ax2.plot(range(len(ind)),rise,color='r',alpha=0.5,linewidth=2,marker='o',label='增长率')
ax2.set_ylabel("增长率",fontproperties=my_font)
# 设置第一张图层的y轴显示,以及设置共用的x轴显示
ax.set_ylabel("18数据",fontproperties=my_font)
ax.set_xlabel("地区",fontproperties=my_font)
# 直接将两个返回值合并,由于返回值内容不同因此不能直接相加
# 如果想要合并返回值相同的图例,直接相加就好,参考数据可视化篇4
lin.append(pillar)
# 提供合并好的内容提供给legend方法,
# 然后提供需要合并图例的文字部分。需要注意提供的顺序要匹配
# 可以在此基础上调整合并后的图例所处位置
plt.legend(lin,['增长率','18年数据'],loc='upper center',prop=my_font)
plt.show()
由于我们绘制的两个图类型都不一样,因此返回值也有所不同,所以不能像数据可视化篇4介绍的方法进行直接合并,但是我们可以调整图例的位置,让两个图例处于不重叠的两个位置。调整位置可以通过legend()方法中的loc参数进行调整:
参数 | 位置 |
upper right | 右上 |
upper left | 左上 |
lower left | 左下 |
lower right | 右下 |
right | 中右 |
center left | 中左 |
center right | 中右 |
lower center | 中下 |
upper center | 中上 |
center | 中 |
当然,该例中介绍的方法可以合并不同返回值图像的方式,也可以应用在别的场景之中,比如合并双y轴的柱状图图例合并。
这节习题课我们介绍了一些对画布进行微调,以及调用numpy绘制基本函数以及对自变量进行等距取值。我们还要多加练习。