# matplotlib

# 参考

# 全局配置/配置

# 配置文件目录
mpl.get_configdir()
# 配置文件完整路径
mpl.matplotlib_fname()
# 动态参数列表
plt.rcParams # 是一个字典类型 可以直接修改和查看
# 使用函数配置
mpl.rc('lines',linewidth=2)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# 控制风格
>>> plt.style.available

['bmh',
 'classic',
 'dark_background',
 'fast',
 'fivethirtyeight',
 'ggplot',
 'grayscale',
 'seaborn-bright',
 'seaborn-colorblind',
 'seaborn-dark-palette',
 'seaborn-dark',
 'seaborn-darkgrid',
 'seaborn-deep',
 'seaborn-muted',
 'seaborn-notebook',
 'seaborn-paper',
 'seaborn-pastel',
 'seaborn-poster',
 'seaborn-talk',
 'seaborn-ticks',
 'seaborn-white',
 'seaborn-whitegrid',
 'seaborn',
 'Solarize_Light2',
 'tableau-colorblind10',
 '_classic_test']

# 保存图形

# 使用savefig()方法以保存图形
fig.savefig('d:/my_fig.png')
plt.savefig('image_name.png', dpi=600,bbox_inches='tight') #定制化
# 显示文件内的图像
from IPython.display import Image
Image('./my_fig.png') # pycharm未显示

# savefig()

# 参数说明
fname:文件路径或文件对象,根据扩展名推断文件格式
dpi:分辨率,默认100
format: 指定文件格式
bbox_inches: 要保存的图片范围。‘tight’表示去掉周边空白。
facecolor:子图之外的背景颜色,默认白色
edgecolor:边界颜色

# 两个接口

# MATLAB 接口-pyplot

用作 matlab 的替代品

x = np.linspace(0,10,100) # 生成点列表
plt.figure() # 创建图形
plt.subplot(2,1,1)  # 行、列、子图编号
plt.plot(x,np.sin(x))
plt.subplot(2,1,2)
plt.plot(x,np.cos(x)) # 第二个子图

# 面向对象接口

fig, ax = plt.subplots(2) # ax是包含两个Axes对象的数组
ax[0].plot(x,np.sin(x)) # 在每个对象上调用plot()方法
ax[1].plot(x,np.cos(x))

# 线形图plot

方法核心是 plot(x,y)​,当只提供 y 的时候则 x 默认使用 0-n 的整数序列。

# 散点图scatter,plot

# plot 对于每一个点使用同一配置,点数多时效率更高
plt.plot(x,y,‘bo’)
# sactter 对于每一个点单独配置
plt.scatter(x,y,marker='o')

# scatter 参数

x,y:输入数据
s:标记大小,以像素为单位
c:颜色
marker:标记
alpha:透明度
linewidths:线宽
edgecolors :边界颜色

# 直方图hist

np.random.seed(2019)

# 创建数据
mu = 100  # 分布的均值
sigma = 15  # 分布标准差
x = mu + sigma * np.random.randn(400) # 生成400个数据

num_bins = 50  # 分50组

plt.hist(x, num_bins, density=1, )

plt.xlabel('Smarts')
plt.ylabel('Probability density')
plt.title(r'Histogram of IQ: $\mu=100$, $\sigma=15$')

# 条形图bar

n = 12   # 12组数据
X = np.arange(n)
Y1 = (1 - X / n) * np.random.uniform(0.5, 1.0, n)  # 生成对应的y轴数据
Y2 = (1 - X / n) * np.random.uniform(0.5, 1.0, n)
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')  # +号让所有y值变成正数
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white') # 负号让所有y值变成复数
# 加上数值
for x, y in zip(X, Y1):  # 显示文本
    plt.text(x, y + 0.05, '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
    plt.text(x, -y - 0.05, '-%.2f' % y, ha='center', va='top')

plt.xlim(-0.5, n)
plt.ylim(-1.25, 1.25)

# 饼图pie

labels = '狗', '猫', '青蛙', '乌龟'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)  

plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
        shadow=True, startangle=90)
plt.axis('equal') # 设置x轴和y轴均等

# pie 参数

x:输入的数据数组
explode:数组,可选参数,默认为None。 用来指定每部分从圆中外移的偏移量。 例如:explode=[0,0.2,0,0],第二个饼块被拖出。
labels:每个饼块的标记
colors:每个饼块的颜色
autopct:自动标注百分比,并设置字符串格式
shadow:是否添加阴影。
labeldistance:被画饼标记的直径。
startangle:从x轴逆时针旋转饼图的开始角度。
radius:饼图的半径
counterclock:指定指针方向,顺时针或者逆时针。
center:图表中心位置。

# 线型颜色和标记

## 常用颜色
蓝色: 'b' (blue)
绿色: 'g' (green)
红色: 'r' (red)
蓝绿色(墨绿色)'c' (cyan)
红紫色(洋红)'m' (magenta)
黄色: 'y' (yellow)
黑色: 'k' (black)
白色: 'w' (white)
## 常用线型
实线:solid(- )
虚线:dashed(--)
点划线:dashdot(-.)
实点线:dotted(:)
## 常用标记
'.' 实点标记
',' 像素标记
'o' 圆形标记
'v' 向下三角符号
'^' 向上三角符号
'D' 钻石形状
'd' 菱形

##使用
plt.plot(x, x + 2, '-.k*') # 黑色点划线星型标记

# 误差线

x = np.linspace(0,10,50)
dy=0.8
y = np.sin(x) + dy*np.random.randn(50)

plt.errorbar(x, y, yerr=dy, fmt='.k')

# 参数说明

yerr: 绘制垂直方向的误差线
xerr:绘制水平方向的误差线
fmt: 线条格式
ecolor: 误差线的颜色
elinewidth:误差线的宽度
capsize: 误差线的长度

# 等高线

plt.contour: 绘制等高线
plt.contourf: 绘制带有填充色的等高线
plt.imshow: 显示图形

# 当图形中只使用一种颜色的时候,就会用虚线来表示复数,实线来表示正数
plt.contour(X, Y, Z, colors='blue')
# 或者使用一个颜色条用不同的颜色表示等高线
plt.contour(X, Y, Z, cmap='RdGy')
plt.colorbar()

# 使用plt.cm.<tab>可以查看有其他配色方案


# 使用imshow方法,将二维数组渲染成渐变图
plt.imshow(Z, extent=[0,5,0,5], origin='lower',cmap='RdGy')
plt.colorbar()

# 使用clabel方法,将一幅背景半透明的彩色图与另一幅坐标相同、带数据标签的等高线叠放在一起
contours = plt.contour(X,Y,Z,3,colors='black') # 分3级
plt.clabel(contours,inline=True, fontsize=8)  # 内部带数值文字
plt.colorbar()

# 多子图

# 手动设置

# 通过plt.axes函数可以创建基本子图,默认情况下它会创建一个标准的坐标轴,并填满整张图。
ax1 = plt.axes()  # 使用默认配置,也就是布满整个画布
ax2 = plt.axes([0.65,0.65,0.2,0.2]) # 在右上角指定位置

# 面向对象
fig = plt.figure()
ax1 = fig.add_axes([0.1,0.5,0.8,0.4],xticklabels=[],ylim=(-1.2,1.2))
ax2 = fig.add_axes([0.1,0.1,0.8,0.4],ylim=(-1.2,1.2))

x = np.linspace(0,10)
ax1.plot(np.sin(x))
ax2.plot(np.cos(x))

# subplot()

for i in range(1, 7):  
    plt.subplot(2,3,i) # 索引从1开始
    plt.text(0.5,0.5,str((2,3,i)), fontsize=16, ha='center')

# 面向对象
fig = plt.figure()
fig.subplots_adjust(hspace=0.4, wspace=0.4)
for i in range(1,7):
    ax = fig.add_subplot(2,3,i)
    ax.text(0.5,0.5,str((2,3,i)), fontsize=16, ha='center')

# 快速创建多子图

# 通过sharex和sharey参数,自动地去掉了网格内部子图的坐标刻度等内容,实现共享,让图形看起来更整齐整洁。
fig, ax = plt.subplots(2,3,sharex='col', sharey='row') # 索引从0开始

# GridSpec 复杂网格

grid = plt.GridSpec(2,3,wspace=0.4,hspace=0.4) # 生成两行三列的网格

plt.subplot(grid[0,0]) # 将0,0的位置使用
plt.subplot(grid[0,1:]) # 同时占用第一行的第2列以后的位置
plt.subplot(grid[1,:2])
plt.subplot(grid[1,2])

# 绘制图形对象 patch

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

# 注意下面三种形状的参数提供方式
rect = plt.Rectangle((0.2,0.75),0.4,0.15,alpha=0.3,color='b')
circ = plt.Circle((0.7,0.2), 0.15,)
pgon = plt.Polygon([[0.15,0.15],[0.35,0.4],[0.2,0.6]])

ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)

# 设置坐标上下限 xlim(), ylim()和 axis()

# plt.xlim(xmin, xmax)
plt.xlim(0, 10)
plt.ylim(0, 10)

# plt.axis([xmin, xmax, ymin, ymax])
# 注意传入的y轴数据可能会因为x轴的实际取值而被覆盖
plt.axis([0, 10, 0, 10]) # -> 实际上y轴显示为[-1000,1000]

# axis 设置更多

off:隐藏轴线和标签
tight:紧缩模式
equal:以11的格式显示,x轴和y轴的单位长度相等
scaled: 通过更改绘图框的尺寸来获得相同的结果
square: x轴和y轴的限制值一样

# plt.axis('tight')

# 自定义刻度 xticks()和 yticks()

# xticks(tikcarr,rotation, fontsize)
plt.xticks([0,250,500,750,1000],rotation=30, fontsize='large')
plt.yticks([-45,-35,-25,-15,0],rotation=30, fontsize='small')

# 图题,轴标签和图例

plt.plot(x, np.sin(x),'-g',label='sin(x)')  # 图例
plt.plot(x, np.cos(x),':b',label='cos(x)')  # 图例
plt.title('a sin curve') # 图题
plt.xlabel("X") # 轴标签
plt.ylabel("sin(X)") # 轴标签

# 标题详细配置

fontsize:字体大小,默认12,也可以使用xx-small....字符串系列
fontweight:字体粗细,或者'light''normal''medium''semibold''bold''heavy''black'。
fontstyle: 字体类型,或者'normal''italic''oblique'。
verticalalignment:垂直对齐方式 ,或者'center''top''bottom''baseline'
horizontalalignment:水平对齐方式,可选参数:‘left’、‘right’、‘center’
rotation:旋转角度
alpha: 透明度,参数值01之间
backgroundcolor: 背景颜色
bbox:给标题增加外框 ,常用参数如下:
	boxstyle:方框外形
	facecolor:(简写fc)背景颜色
	edgecolor:(简写ec)边框线条颜色
	edgewidth:边框线条大小

# 图例详细配置

loc 图例的位置
prop 字体参数
fontsize 字体大小
markerscale 图例标记与原始标记的相对大小
markerfirst 如果为 True,则图例标记位于图例标签的左侧
numpoints 为线条图图例条目创建的标记点数
scatterpoints 为散点图图例条目创建的标记点数
scatteryoffsets 为散点图图例条目创建的标记的垂直偏移量
frameon 是否显示图例边框
fancybox 边框四个角是否有弧度
shadow 控制是否在图例后面画一个阴影
framealpha 图例边框的透明度
edgecolor 边框颜色
facecolor 背景色
ncol 设置图例分为 n 列展示
borderpad 图例边框的内边距
labelspacing 图例条目之间的垂直间距
handlelength 图例句柄的长度
handleheight 图例句柄的高度
handletextpad 图例句柄和文本之间的间距
borderaxespad 轴与图例边框之间的距离
columnspacing 列间距
title 图例的标题
0: ‘best' : 自动选择最适合的位置
1: ‘upper right': 右上
2: ‘upper left': 左上
3: ‘lower left': 左下
4: ‘lower right':右下
5: ‘right':右
6: ‘center left':左中
7: ‘center right':右中
8: ‘lower center':下中
9: ‘upper center': 上中
10: ‘center':中间

# 颜色条-独立坐标轴

在 matplotlib 中,颜色条是一个独立的坐标轴,用于指明图形中颜色的含义。

image.png

# 配色方案

顺序配色:由一组连续的颜色构成,比如binary和viridis
互逆色:通常由互补的颜色构成,比如RdBu或者PuOr
定性配色:随机顺序的一组颜色,比如rainbow或jet

# 文本、箭头和注释

# 文本

# 添加注释 plt.text()
# plt.text(x, y, s, fontdict=None, withdash=False, **kwargs)
x,y:坐标值,文字放置的位置
string:文字内容字符串
size:字体大小
alpha:设置字体的透明度
family: 设置字体
style:设置字体的风格
wight:字体的粗细
verticalalignment:垂直对齐方式,缩写为va。可用值 ‘center’ | ‘top’ | ‘bottom’ | ‘baseline’。
horizontalalignment:水平对齐方式 ,缩写为ha。可用值‘center’ | ‘right’ | ‘left’
xycoords:选择指定的坐标轴系统
bbox给标题增加外框 ,常用参数如下:
boxstyle:方框外形
facecolor:(简写fc)背景颜色
edgecolor:(简写ec)边框线条颜色
edgewidth:边框线条大小

# 其余参数

alpha 0-1 透明度
color 或 c 颜色格式 设置线条颜色
label 字符串 为图形设置标签
linestyle 或 ls 可用线型 设置线条风格
linewidth 或 lw 数值 线宽
marker 可用标记 标记
markeredgecolor 或 mec 颜色 标记的边缘颜色
markeredgewidth 或 mew 数值 标记的边缘宽度
markerfacecolor 或 mfc 颜色 标记的颜色
markersize 或 ms 数值 标记的大小
solid_capstyle butt​、round​、projecting 实线的线端风格
solid_joinstyle miter​、round​、bevel 实线的连接风格
drawstyle default​、steps​、steps-pre​、steps-mid​、steps-post 连线的规则
visible True​、False 显示或隐藏
xdata np.array 主参数 x 的输入
ydata np.array 主参数 y 的输入

# plt 到 ax

plt.xlabel() -> ax.set_xlabel()
plt.ylabel() -> ax.set_ylabel()
plt.xlim() -> ax.set_xlim()
plt.ylim() -> ax.set_ylim()
plt.title() -> ax.set_title()

# 可以不单独调用
ax.set(xlim=(0,10),ylim=(-2,2),xlabel='x',ylabel='sin(x)',title='a sin  plot')

# 子图
fig = plt.figure()
ax1 = fig.add_axes([0.1,0.5,0.8,0.4],xticklabels=[],ylim=(-1.2,1.2))
ax2 = fig.add_axes([0.1,0.1,0.8,0.4],ylim=(-1.2,1.2))

x = np.linspace(0,10)
ax1.plot(np.sin(x))
ax2.plot(np.cos(x))