Python科学绘图6共享x轴的subplot阴影和添加文本

一、绘制共享x轴但是拥有不同y轴的两条线

twinx()/twiny()函数:共享x轴/y轴的subplot

new_sub = sub.twinx()
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10,1001)

y = x
y1 = 100 - x

fig = plt.figure()
sub = fig.add_subplot(111)
sub.set_xlabel('x', fontsize=14)
sub.set_ylabel('y', fontsize=14)
sub.plot(x, y, label='y=x')

sub2 = sub.twinx()
sub2.plot(x, y1, label='y=100-x')
sub.legend()
plt.show()

在这里插入图片描述

两个问题:

  1. 直线1的图例与直线2重叠了

因为两条线属于两个sub.plot().不互相检测位置,且颜色都默认为C0

将直线1的图例位置放到左边中间,图二颜色改为C1且产生图二图例

sub.legend(loc='center left')
sub2.plot(x, y1, label='y=100-x', color='C1')
sub2.legend(loc='center right')

在这里插入图片描述

  1. 左右y坐标系无法区分那个坐标系是y1那个坐标系是y2

可以分别对两个sub添加y轴标签

设置y1轴标签 y1刻度和刻度标签颜色均为C0

设置y2轴标签 y2刻度和刻度标签颜色均为C1

sub.set_ylabel('y', fontsize = 14, color='C0')
sub.tick_params(colors='C0')
sub2.set_ylabel('y2', fontsize = 14, color='C1')
sub2.tick_params(colors='C1')

在这里插入图片描述
注意:共享x轴x轴的标签只能在sub中改不能在sub2中改

sub2.spines[’’].set_color(’’):设置左右y轴轴线颜色

sub2.spines['right'].set_color('C1')
sub2.spines['left'].set_color('C0')

在这里插入图片描述

二、sub.axvspan(x1,x2)/sub.axhspan(y1,y2):添加阴影区域

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,1,101)

y= np.cos(2 * np.pi * x)

fig = plt.figure()
sub = fig.add_subplot(111)
sub.plot(x,y)
sub.set_xlabel('x', fontsize=15)
sub.set_ylabel('y', fontsize=15)
plt.show()

结果:
在这里插入图片描述
目的:
在四分之一周期到四分之三周期之间加上一个阴影起到强调作用

sub.axvspan(0.25,0.75)   

在这里插入图片描述

关键字:color设置颜色

sub.axvspan(0.25, 0.75, color='yellow')   

关键字:alpha设置透明度(0-1)

sub.axvspan(0.25, 0.75, color='yellow', alpha=0.5)   

在这里插入图片描述

关键字:label=:设置标签可以添加图例

例如添加图例

sub.plot(x, y, label='y=cosx')
sub.axvspan(0.25, 0.75, color='yellow', alpha=0.5, label='y<0')   
sub.legend()

在这里插入图片描述

设置阴影区域高度

sub.axvspan(0.25, 0.75, y1, y2,color='yellow')   

其中y1 y2是归一化值取值为(0-1),即y轴上百分比
例如

sub.axvspan(0.25, 0.75, 0, 0.5,color='yellow')   

阴影区域高度就是从y = 最低到y=0.5倍y轴即y轴中间

sub.axhspan(0.25, 0.75, x1, x2,color=‘yellow’) 同理

sub.fill_between():填充两条线之间的区域

sub.fill_between(x,y0,y1):填充介于y0(x),y1(x)之间的区域

sub.fill_between([0.25, 0.75], [-1, -1], [1, 1])

两个列表对应位置组合:
y0(x) 就是由点(0.25,-1)和(0.75,-1)确定的直线
y1(x) 就是由点(0.25,1)和(0.75,1)确定的直线

在这里插入图片描述
在这里插入图片描述
同样可以更改颜色,透明度,标签等关键字

x1 = np.linspace(0.25,0.75,100)
y1 = np.cos(2 * np.pi * x)
y2 = y1-0.25

sub.fill_between(x1, y1, y2, color='yellow', alpha=0.5)

在这里插入图片描述

三、sub.text():添加文本框

sub.text(x, y, str):在(x, y)处添加字符串str
其中(x, y)为数据坐标不是归一化坐标,默认为text左下角坐标

sub.text(0, 0,r'y = cos2π', fontsize=15, color='C1')

关键字:horizontalalignment=:可以缩写为ha

可以为center、left或者right表示文本在水平方向的对其方式,默认情况是left左对齐

sub.text(0, 0,r'y = cos2π', fontsize=15, color='C1', ha='center')

关键字:verticalalignment=:可以缩写为va

可以为center、top或者bottom表示文本在垂直方向的对其方式,默认为bottom

sub.text(0.5, 0.2,r'y = cos2π', fontsize=15, color='C1', ha='center', va='center')

这样(x, y)表示的不在是text左下角的位置而是text最中间的位置
在这里插入图片描述

关键字:transform=sub.transAxes:使用归一化坐标

将sub.text(x, y, str):中(x, y)为数据坐标转化为归一化坐标表示

关键字:rotation = 45:表明文本的旋转角度逆时针

sub.text(0.5, 0.2,r'y = cos2π', fontsize=15, color='C1', 
	ha='center', va='center', rotation = 45)

关键字:bbox = dict(各种属性):给文本添加边框

bbox = bounding box edgecolor边框颜色、facecolor填充颜色、alpha=0.5透明度

bbox =dict(edgecolor=‘green’, facecolor=‘red’)

facecolor=‘None’ 无填充

同样可以dict()内设置linestyle设置边框线的虚实,linewidth边框线的粗细

sub.text(0.5, 0.2,r'y = cos2π', fontsize=15, color='C1', 
	ha='center', va='center', rotation = 45, bbox =dict(edgecolor='green',
	facecolor='red', alpha=0.5))

在这里插入图片描述


版权声明:本文为weixin_46829056原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。