Matplotlib
图像组成
tilte 标题
figure 画板
axes 画布
legend 图例
axis 轴
- 横轴x轴
- 纵轴y轴
tickes 刻度
ticklabels 刻度标签
x_label y_label 轴标签
annote 注释信息
导包
获取画板
- plt.figure(figsize=)
获取画布
- plt.subplot()
就近原则
- plt.的所有操作都是操作最近的上一个画布
- 所有的画布,都会默认被配置在离自己最近的那个画板上
网格线
- 面向过程
- plt.grid()
- 面向对象
- axes.grid()
坐标轴界限
- 默认情况是,画布刻度的边界是由绘图的数据决定的
- 通用方式
- axes.axis()
- axes.axis()里传入列表,分别为x下限,x上限,y下限,y上限
- 面向过程
- plt.xlim()
- plt.ylim()
- 面向对象
- axes.set_xlim()
- axes.set_ylim()
- 通用方式
- 面向过程
- 面向对象
设定刻度
面向过程
plt.xticks()
和plt.yticks()
- 需指定刻度值和刻度label plt.xticks([刻度列表],[label列表])
面向对象
axes.set_xticks()
和axes.set_yticks()
axes.set_xtickslabel()
和axes.set_ytickslabel()
支持fontsize、rotation、color等参数设置
坐标轴标签
- 面向过程
plt.xlabel()
和plt.ylabel()
- 面向对象
axes.set_xlabel()
和axes.set_ylabel()
通用的外观设计
- color: 颜色
- fontsize: 字体大小
- rotation: 旋转角度
画布标题
- 面向过程
plt.title()
- 面向对象
axes.set_title()
图例
- 面向过程
plt.legend()
- 面向对象
axes.set_legend()
两种传参方式
分别在plot函数中增加label参数,再调用legend()方法显示
直接在legend方法中传入字符串列表
面向过程
分别在plot函数中增加label参数,再调用legend()方法显示
直接在legend方法中传入字符串列表
面向对象
loc参数
- loc参数用于设置图例标签的位置,一般在legend函数内
- matplotlib已经预定义好几种数字表示的位置
字符串 | 数值 | 字符串 | 数值 |
---|---|---|---|
best | 0 | center left | 6 |
upper right | 1 | center right | 7 |
upper left | 2 | lower center | 8 |
lower left | 3 | upper center | 9 |
lower right | 4 | center | 10 |
right | 5 |
loc参数还可以是2元素的元组,使用相对位置来表示图例左下角的坐标
- [0,0] 左下
- [0,1] 左上
- [1,0] 右下
- [1,1] 右上
ncol参数
- ncol控制图例中有几列,在legend中设置ncol,需要设置loc
Linestyle,color,marker
- 修改线条样式
图像保存
plt.savefig('路径',dpi=像素(int),facecolor='green')
- 画板figure对象的颜色不会被保存到本地
- 要搞颜色在savefig里设置
保存后的图片会显示设置的facecolor
添加注释(Annote)
test()
subtitle()
figtest()
annotate()
添加文字的方法:
pyplot函数 | API方法 | 描述 |
---|---|---|
text() | mpl.axes.Axes.text() | 在Axes对象的任意位置添加文字 |
figtext() | mpl.figure.Figure.text() | 在Figure对象的任意位置添加文字 |
suptitle() | mpl.figure.Figure.suptitle() | 为Figure对象添加中心化的标题 |
annotate() | mpl.axes.Axes.annotate() | 为Axes对象添加注释(箭头可选) |
所有的方法会返回一个matplotlib.text.Text对象
图形内的文字
text()
x/y:位置参数
- 绝对位置
- 相对位置
s:文本信息
fontdict:字体参数设置,字典
画板上添加文字
- figtest()
- 用法和test()完全一致,不赘述
添加画板标题
subtitle()
x/y:位置参数
- 绝对位置
- 相对位置
t:文本内容
图像同上
添加箭头注释
annonate()
text:文本内容
xy:箭头指向点的坐标,传入元组
xytest:文字放置位置,元组
arrowprops:箭头属性,字典,不写就用默认的箭头样式
width参数设置箭头长方形部分的宽度
headlength参数设置箭头尖端的长度,
headwidth参数设置箭头尖端底部的宽度
shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值),可以理解为控制箭头的长度
轴 axis
画双轴图
# 画图
fig = plt.figure(figsize=(12,8))
ax1 = plt.subplot(111)
ax1.plot(temp['ym'],temp['ym_revenue(百万円)_東開店'],label = '東開店',color='darkgreen')
ax1.plot(temp['ym'],temp['ym_revenue(百万円)_名古屋茶屋店'],label = '名古屋茶屋店',color='brown')
ax1.set_xlabel('date')
ax1.set_ylabel('飲料売上')
ax2 = ax1.twinx()
ax2.plot(temp['ym'],temp['diff'],label = 'diff')
ax2.set_ylabel('東開店の売上 - 名古屋茶屋店の売上')
fig.legend(["東開店売上", "名古屋茶屋店売上", "diff"],loc=(0.65,0.85))
plt.title('年月別の飲料売上金額')
图像展示
- plt.imshow()
- 传入图片路径
- plt.imread()
- 传入一个三维数组
风格和样式设置
# plot语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色、线型、点型等要素,语法形式为:
plt.plot(X, Y, 'format', ...)
颜色的各种表达方式
别名
- color='r'
合法的HTML颜色名
- color = 'red'
颜色 | 别名 | HTML颜色名 | 颜色 | 别名 | HTML颜色名 |
---|---|---|---|---|---|
蓝色 | b | blue | 绿色 | g | green |
红色 | r | red | 黄色 | y | yellow |
青色 | c | cyan | 黑色 | k | black |
洋红色 | m | magenta | 白色 | w | white |
HTML十六进制字符串
- color = '#eeefff'
归一化到[0, 1]的RGB元组
- color = (0.3, 0.3, 0.4)
透明度
- alpha参数
- 0.0 ~ 1.0 float
背景色
- 设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标系的背景色
点和线的样式
线型
- 参数为
- linestyle
- ls
线条风格 | 描述 | 线条风格 | 描述 |
---|---|---|---|
'-' | 实线 | ':' | 虚线 |
'--' | 破折线 | 'steps' | 阶梯线 |
'-.' | 点划线 | 'None' / ',' | 什么都不画 |
线宽
- 参数为
- linewidth
- lw
不同宽度的破折线
- 使用dashes参数 ,传入列表,为破折号序列各段的宽度
- 比如:
- dashes = [5,1,2,1]
- 一段线长为5,空白长为2,线长为2,空白长1,重复。
点型
- marker 设置点形
- markersize 设置点形大小
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
'1' | 一角朝下的三脚架 | '3' | 一角朝左的三脚架 |
'2' | 一角朝上的三脚架 | '4' | 一角朝右的三脚架 |
's' | 正方形 | 'p' | 五边形 |
'h' | 六边形1 | 'H' | 六边形2 |
'8' | 八边形 | ||
'.' | 点 | 'x' | X |
'*' | 星号 | '+' | 加号 |
',' | 像素 | ||
'o' | 圆圈 | 'D' | 菱形 |
'd' | 小菱形 | '','None',' ',None | 无 |
'_' | 水平线 | '|' | 竖线 |
'v' | 一角朝下的三角形 | '<' | 一角朝左的三角形 |
'^' | 一角朝上的三角形 | '>' | 一角朝右的三角形 |
更多点和线的设置
- markersize = 20
- markeredgecolor = 'green',
- markeredgewidth = 2,
- markerfacecolor = 'purple'
对实例使用一系列的set方法
- plt.plot()方法返回一个包含所有线的列表,设置每一个线需要获取该线对象
- eg: lines = plt.plot(); line = lines[0]
- line.set_linewith()
- line.set_linestyle()
- line.set_color()
对坐标系使用一系列的set方法
- axes = plt.subplot()获取坐标系
- set_title()
- set_facecolor()
- set_xticks、set_yticks 设置刻度值
- set_xticklabels、set_yticklabels 设置刻度名称
推荐的绘图方式
不推荐的绘图方式,但得了解
多参数连用
- 颜色、点型、线型,可以把几种参数写在一个字符串内进行设置 ,比如 'r-.o'
多个曲线同一设置
属性名声明,不可以多参数连用
plt.plot(x1, y1, x2, y2, fmt, ...)
多个曲线不同设置
多个曲线都进行设置时,多参数连用
plt.plot(x1, y1, fmt1, x2, y2, fmt2, ...)
Matplotlib 2D绘图
线型图
俩参数x,y,适用于:
- 连续数据
- 时间序列
强调连续性,变化趋势,一个变量随着另一个变量的变化规律。
kind参数可以选择线的种类
散点图
scatter()
【散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标】
关注离散数据,变量与变量之间的关系
线性图是有序的,散点图是无序的
scatter可以表达四维,x,y,大小,颜色
直方图
hist()
最常用于查看数据的分布情况,和最普通的数据可视化也可以用hist
参数只有一个x!!!数据的频数(y轴)统计。
hist()的参数
bins
- 可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10
density
- 如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False,
- 结合plt.plot(kind='kde')一起画
color
- 指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色
orientation
- 通过设置orientation为horizontal创建水平直方图。默认值为vertical
举个例子
- 查看不同类别的店铺的面积分布情况
条形图(柱状图)
bar() , barh()
条形图有两个参数x,y
width 纵向设置条形宽度
height 横向设置条形高度
比较数据的大小关系,强调比较
普通条形图
堆叠条形图
方法一:plt.plot() (这好,用这个)
直接
df.plot(kind = 'bar',stacked = True)
数据长下面这个样子:
画堆叠图长下面这样
ax = store_revenue_rate.plot(kind='bar',stacked=True)
plt.ylabel('比率(%)')
plt.legend(loc=(0.9,0.65))
plt.title('店別の飲料ディビジョン全体における部門別売上構成比')
plt.xticks(rotation = 0)
# 在堆叠图上显示百分比
for container in ax.containers:
ax.bar_label(container, fmt='%.1f%%', label_type='center')
方法二:plt.bar()
簇状条形图
方法一:plt.plot() (这个好用这个)
方法二:plt.bar()
极坐标条形图(玫瑰图)
创建极坐标,设置polar属性
- plt.axes(polar = True)
0-2 π是极坐标唯一一个轴的取值范围。
本质是极坐标 + 条形图
# 0-2Π 是极坐标唯一一个轴的取值范围,永远不会变
plt.axes(polar=True)
data = np.random.randint(10, 20, size=8)
plt.bar(x=np.linspace(0, 2*np.pi, 8, endpoint=False),
height=data, color=np.random.random(size=(8, 3)),
width=0.8, align='edge')
雷达图
- 本质是极坐标 + 线性图
index = ['A','B','C','D']
data1 = np.random.randint(10, 100, size=(4))
data2 = np.random.randint(10, 100, size=(4))
# 为了解决图像不闭合
data11 = np.append(data1, data1[0])
data22 = np.append(data2, data2[0])
# 为了解决标签分布不均匀的问题
x = np.linspace(0, 2*np.pi, 4, endpoint=False)
xx = np.append(x, x[0])
plt.axes(polar=True)
# 修改为闭合的图像
plt.plot(xx, data11)
plt.plot(xx, data22)
_ = plt.xticks(x, index)
饼图
- pie()
- 饼图也只有一个参数x!!!
- 同时表达:
- 两组数据的对比
- 各子数据的占比情况
- 饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小
- labels参数设置每一块的标签;
- labeldistance参数设置标签距离圆心的距离(比例值,只能设置一个浮点小数)
- autopct参数设置比例值的显示格式(%1.1f%%);
- pctdistance参数设置比例值文字距离圆心的距离
- explode参数设置每一块顶点距圆形的长度(比例值,列表);
- colors参数设置每一块的颜色(列表);
- shadow参数为布尔值,设置是否绘制阴影
- startangle参数设置饼图起始角度
# 填满的饼图
data = np.array([30, 60, 45])
index = ['A','B','C']
_ = plt.pie(data, labels=index, labeldistance=1.1, autopct='%1.1f%%',
pctdistance=0.5, explode=[0, 0, 0.1], colors=np.random.random(size=(3,3)),
shadow=True, startangle=10)
_ =plt.axis('equal')
# 不填满的饼图, 保证展示的数据的和不要超过1
data = np.array([30, 60, 45])[:2]
index = ['A','B','C']
_ = plt.pie(data, labels=index[:2], labeldistance=1.1, autopct='%1.1f%%',
pctdistance=0.5, explode=[0, 0.1], colors=np.random.random(size=(3,3)),
shadow=True, startangle=10)
_ =plt.axis('equal')
箱线图
plt.boxplot()
参数说明:
x, # 指定要绘制箱线图的数据;
notch=None, # 是否是凹口的形式展现箱线图,默认非凹口;
sym=None, # 指定异常点的形状,默认为+号显示;
vert=None, # 是否需要将箱线图垂直摆放,默认垂直摆放;
whis=None, # 指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
positions=None, # 指定箱线图的位置,默认为[0,1,2…];
widths=None, # 指定箱线图的宽度,默认为0.5;
patch_artist=None, # 是否填充箱体的颜色;
meanline=None, # 是否用线的形式表示均值,默认用点来表示;
showmeans=None, # 是否显示均值,默认不显示;
showcaps=None, # 是否显示箱线图顶端和末端的两条线,默认显示;
showbox=None, # 是否显示箱线图的箱体,默认显示;
showfliers=None, # 是否显示异常值,默认显示;
boxprops=None, # 设置箱体的属性,如边框色,填充色等;
labels=None, # 为箱线图添加标签,类似于图例的作用;
flierprops=None, # 设置异常值的属性,如异常点的形状、大小、填充色等;
medianprops=None, # 设置中位数的属性,如线的类型、粗细等;
meanprops=None, # 设置均值的属性,如点的大小、颜色等;
capprops=None, # 设置箱线图顶端和末端线条的属性,如颜色、粗细等;
whiskerprops=None, # 设置须的属性,如颜色、粗细、线的类型等
全局设置
# 字号设置为20
plt.rcParams['axes.titlesize'] = 20
# 对画布颜色进行全局的配色,为绿色
plt.rcParams['axes.facecolor'] = 'lightgray'
# 'lines.linestyle': '-',
# 'lines.linewidth': 1.5,
plt.rcParams['lines.linestyle'] = '--'
plt.rcParams['lines.linewidth'] = 3
# 汉字
plt.rcParams['font.sans-serif'] = 'SimHei'
# 负号
plt.rcParams['axes.unicode_minus'] = False
#日语
plt.rcParams['font.family'] = 'Hiragino Sans GB'
sns.set(font='IPAexGothic')
# 显示所有行
pd.set_option('display.max_rows',None)
#显示所有列
pd.set_option('display.max_columns',None)
#过滤warning
warnings.filterwarnings('ignore')
加载自定义字体
from matplotlib import font_manager
# 需要下载ttf格式的字体文件
fp = font_manager.FontProperties(fname='./蒙纳超刚黑简.ttf')
plt.title('中国是一个强悍的发展中国家', fontproperties = fp, fontsize=20)
杂七杂八
matplotlib的设置默认字体
plt.rcParams['font.sans-serif'] = ['Arial', 'sans-serif']
# 配置绘图的位置为当前画布内(可以不写,但是建议写)
%matplotlib inline
matplotlib不显示科学记数法
plt.ticklabel_format(axis='y', style='plain')
put.show()
- 强制将当前绘图信息渲染到最近的画布上
面向过程plt.xxx
面向过程的风格全部遵循最近原则
魔法指令
# 如果画图不显示,试试这个
%matplotlib inline
# 交互式画图的魔法指令
%matplotlib widget