一、绘制共享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的图例与直线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')

- 左右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))
