5.1 绘制双坐标轴
在数据分析中,很多时候,由于变量之间的量纲不一样,如果绘制在同一坐标轴上,那么量纲级较小的变量就很难看出变化的趋势,所以需要绘制双坐标轴,来显示两个变量的趋势
x = np.arange(0.01, np.e, 0.01)
y1 = np.exp(-x)
y2 = np.log(x)
fig = plt.figure() # 创建作图对象
ax1 = fig.add_subplot(111)
ax1.plot(x, y1)
ax1.set_ylabel('Y values for exp(-x)')
ax1.set_title("Double Y axis")
ax1 = ax1.twinx() # this is the important function #添加次坐标轴
ax2.plot(x, y2, 'r')
ax2.set_xlim([0, np.e])
ax2.set_ylabel('Y values for ln(x)')
ax2.set_xlabel('Same X for both exp(-x) and ln(x)')
ax2.tick_params('y',colors='r') #改变y轴刻度颜色
plt.show()
eg: 实际案例
GDP_data = pd.read_excel('国民经济核算季度数据.xlsx')
fig =plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(GDP_data['序号'],GDP_data['国内生产总值_当季值(亿元)'],label='GDP',c= 'r')
ax1.set_ylabel('国内生产总值_当季值(亿元)')
ax1.set_title("国内生产总值_当季值(亿元)和工业增加值_当季值(亿元)变化趋势")
plt.xticks(range(0,70,4),GDP_data.iloc[range(0,70,4),1],rotation=45)
ax1.legend(loc='upper left')
ax2 = ax1.twinx() #设置次坐标
ax2.plot(GDP_data['序号'],GDP_data['工业增加值_当季值(亿元)'],label='金融增加值',c='g')
#ax2.plot(GDP_data['序号'],GDP_data['金融业增加值_当季值(亿元)'],label='工业增加值',c='g')
ax2.set_ylabel('工业增加值_当季值(亿元)')
ax2.set_xlabel('时间')
ax2.legend(loc='upper center')
plt.show()
5.2 添加注解
通过更加精细的设置来添加注解,是的图形更加个性化
eg1:注解
fig1 = plt.figure('1')
x = np.linspace(0,10,40)
y = np.random.randn(40)
plt.plot(x,y,ls='--',lw=2,marker='o',ms=20,mfc='orange',alpha=0.6)
plt.grid(ls=':',color='gray',alpha=0.5)
plt.text(6,0,'Matplotlib',size=30,rotation=30,bbox=dict(boxstyle='round',ec='#8968CD',fc='#FFE1FF'))
# plt.text(6,0,'Matplotlib',size=30,color='black',rotation=0,bbox=dict(boxstyle='round',ec='green',fc='red'))
# ec--边缘颜色,fc--代表填充色,boxstyle--样式
fig1.show()
- bbox的参数要注意
eg2:水印效果
fig2 = plt.figure('2')
x = np.linspace(0,10,40)
y = np.random.randn(40)
plt.plot(x,y,ls='--',lw=2,marker='o',ms=20,mfc='orange',alpha=0.6)
plt.grid(ls=':',color='gray',alpha=0.5) #alpha是透明度
plt.text(1,2,'Matplotlib',size=30,rotation=50,color='gray',alpha=0.5)
fig2.show()
- 水印就是改变注解的透明度
- 这里可以同时显示两幅图
eg3:指向性注解
x = np.linspace(0.5,3.5,100)
y = np.sin(x)
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111)
ax.plot(x,y,c='b',ls='--',lw=2)
ax.annotate('maximum',xy=(np.pi/2,1),xycoords = 'data',
xytext =((np.pi/2)+0.15,0.8),textcoords='data',
weight='bold',color='r',fontsize=20,
arrowprops=dict(arrowstyle='->',connectionstyle='arc3',color='r'))
ax.text(2.8,0.4,'$y=\sin(x)$',fontsize=20,color='b',bbox=dict(facecolor='y',alpha=0.3))
plt.show()
- xy控制的是箭头坐标
- xytext控制的是文本坐标
- xycoords = 'data’表示和折线图使用的是相同的坐标系统
eg4:有弧度的注解
x = np.linspace(0,10,2000)
y = np.sin(x)*np.cos(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y,c='c',ls='--',lw=2)
bbox=dict(boxstyle ='round',fc='#7EC0EE',edgecolor='#9B30EF') # 控制样式和颜色参数
arrowprops =dict(arrowstyle='-|>',
connectionstyle='angle,angleA=0,angleB=90,rad=10',color='r') #箭头参数
ax.annotate('single point',(5,np.sin(5)*np.cos(5)),
xytext =(3,np.sin(3)*np.cos(3)),fontsize=15,color='r',
arrowprops=arrowprops, bbox=bbox)
ax.grid(ls=':',color='gray', alpha=0.6)
plt.show()
arrowprops里的参数主要使用:
- arrowstyle:箭头类型
- color:颜色
- conectionstyle,又包括:
- angleA等:从text处发出的连接线与x轴的夹角
- rad:连接线之间的弧度
eg5:趋势线
x = np.linspace(0,10,2000)
y = np.sin(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y,c='c',ls='--',lw=2)
ax.set_ylim(-1.5,1.5)
arrowprops =dict(arrowstyle='-|>',color='r')
ax.annotate('',(3*np.pi/2,np.sin(3*np.pi/2)+0.05), #代表箭头位置
xytext =(np.pi/2,np.sin(np.pi/2)+0.05),color='r',arrowprops=arrowprops) #添加趋势线,文本位置
ax.arrow(0,-0.4,np.pi/2,1.2,head_width=0.05,head_length=0.1,fc='blue',ec='red')#添加趋势线
# 0和-0.4代表起始位置,后面两个分别代表x和y的水平增量
ax.grid(ls=':',color='gray',alpha=0.6)
plt.show()
- 画箭头有两种方式:ax.annotate和ax.arrow
5.3 投影效果
x = np.linspace(0.5,3.5,100)
y = np.sin(x)
fig =plt.figure(figsize=(8,8))
ax = fig.add_subplot(111)
box = dict(facecolor='#6959CD',pad=2,alpha=0.4)
ax.plot(x,y,c='b',ls='--',lw=2)
title = '$y=\sin({x})$'
xaxis_label="$x\_axis$"
yaxis_label="$y\_axis$"
ax.set_xlabel(xaxis_label,fontsize=18,bbox=box)
ax.set_ylabel(yaxis_label,fontsize=18,bbox=box)
ax.set_title(title,fontsize=23,va='bottom') #控制位置的
ax.yaxis.set_label_coords(-0.05,0.8) # axes 坐标
ax.xaxis.set_label_coords(1.0,-0.05)# axes 坐标移动位置
ax.grid(ls=':',lw=1,color='gray',alpha=0.5)
plt.show()
最后运行一个案例
eg:
GDP_data = pd.read_excel('国民经济核算季度数据.xlsx')
xaxis_label="季度"
yaxis_label="GDP(产值)"
title = 'GDP变化趋势'
box = dict(facecolor='#6959CD',pad=2,alpha=0.4) # 控制坐标轴的参数
fig = plt.figure()
ax = fig.add_axes([0.09,0.18,0.85,0.7])
#ax = fig.add_subplot(111)
ax.plot(GDP_data['序号'],GDP_data['国内生产总值_当季值(亿元)'],c= 'c')
ax.set_xlabel(xaxis_label,fontsize=18,bbox=box)
ax.set_ylabel(yaxis_label,fontsize=18,bbox=box)
ax.set_title(title,fontsize=23,va='baseline')
ax.yaxis.set_label_coords(-0.06,0.5) # axes 坐标
ax.xaxis.set_label_coords(1.02,-0.05)# axes 坐标移动位置
plt.xticks(range(0,70,4),GDP_data.iloc[range(0,70,4),1],rotation=45,fontsize=12)
ax.grid(ls=':',lw=1,color='gray',alpha=0.5)
plt.show()