Matplotlib是python进行绘图的重要包,基本满足日常的需要,是进行数据分析、可视化等不可或缺的一部分。
图表基础知识
- 画板 figure
- 画纸 subplot
- 画纸上方是表题 title
- 坐标轴 axis
- 图例 legend
- 网格 grid
- 点 marker
理解 plt ax fig 是什么?https://zhuanlan.zhihu.com/p/93423829
plt.figure()
plt.plot()
plt.show()
一般我们就是使用 plt.xxx 进行绘图,可以迅速绘制出基本图表,但对图表进行细致的调整方面,这种方式就比较困难了。这种方式就是简单易懂上手快。
fig,ax = plt.subplots()
ax.plot()
这种方式,可以使用 ax 这个东西对图表进行精细的调整,在它的属性中,包括了图表的所有属性,以及更加细致的API。可以将其理解为图表的控件,一个图表(子图)具有一个ax。
绘图步骤
(前提:准备好数据X Y)
绘制顺序
-
图表属性
中文 属性 属性值 相关属性 颜色 color rgb(0,0,0) #0000 点标记 marker markersize 线型 linstyle '--' '-.' '-' ':' 轴 axis 图例 legend ncols,fontsize 网格 grid 刻度 xticks 刻度 yticks -
文本
- 坐标轴 xlabel ylabel
- 标题 title
- 其他 plt.annotate
-
显示 plt.show()
多图绘制
【如果事先不声明画板画板,默认是创建一个画板一个画纸】
- 使用figure()方法创建画板
- 使用subplot()方法创建画纸,并选择当前画纸并绘图
- 同样用subplot()方法选择画纸并绘图
- 显示图表
绘制技巧
中文设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
图表大小
1、图形大小设置
matplotlib 设置图形大小时 figsize 与 dpi 的关系 - 木子识时务 - 博客园 (cnblogs.com)
坐标轴
1、取消坐标轴显示
ax = plt.gca() # 得到图像的Axes对象
ax.spines['right'].set_color('none') # 将图像右边的轴设为透明
ax.spines['top'].set_color('none') # 将图像上面的轴设为透明
ax.spines['left'].set_color('none') # 将图像左边的轴设为透明
ax.spines['bottom'].set_color('none') # 将图像下面的轴设为透明
2、坐标轴刻度位置调整
ax = plt.gca()
ax.xaxis.set_ticks_position('bottom') # 将x轴刻度设在下面的坐标轴上
ax.yaxis.set_ticks_position('left') # 将y轴刻度设在左边的坐标轴上
3、坐标轴位置调整
ax = plt.gca()
# 具体交点位置(x,y)控制
ax.spines['bottom'].set_position(('data', 0)) # 将两个坐标轴的位置设在数据点原点
ax.spines['left'].set_position(('data', 0))
# 粗略位置 top bottom left right
ax.xaxis.set_ticks_position('top') #将X坐标轴移到上面
4、坐标轴反转
ax = plt.gca()
# 正常 从下到上 依次增大
# 反转后 从上到下 依次增大
ax.invert_yaxis() #反转Y坐标轴
ax.invert_xaxis()
刻度设置
将坐标轴刻度设置为百分数形式
from matplotlib import ticker
ax = plt.gca()
ax.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=2))
坐标轴刻度位置调整
ax = plt.gca()
ax.xaxis.set_ticks_position('bottom') # 将x轴刻度设在下面的坐标轴上
ax.yaxis.set_ticks_position('left') # 将y轴刻度设在左边的坐标轴上
其他设置
plt.set_xticks()
plt.set_yticks()
平均线
水平平均线(横向图)
fig,ax = plt.subplots()
ax.axhline(y=sum(y)/len(y),color='gray',linestyle='--',label='平均水平')
竖直平均线(纵向图)
x = ['A', 'B', 'C', 'D']
y = [1, 2, 3, 4]
fig, ax = plt.subplots()
rects = ax.bar(x, y)
ax.axhline(y=sum(y)/len(y), color='r', linestyle='-')
plt.show()
数据标签
1、柱状图添加数据标签
fig, ax = plt.subplots()
ax.bar([1, 2], [0.25, 0.75])
ax.set_xticks([1, 2])
ax.set_xticklabels(['A', 'B'])
rects = ax.bar(x, y)
# 单列柱状图 添加数据标签
ax.bar_label(rects)
plt.show()
# 多列柱状图添加数据标签 这里进行了格式化输出 为百分比形式
for i in ax.containers:
ax.bar_label(i, label_type='edge', labels=[f'{x*100:.0f}%' for x in i.datavalues])
2、折线图添加数据标签
x = [1, 2, 3, 4]
y = [1, 4, 9, 16]
fig, ax = plt.subplots()
ax.plot(x, y)
# 格式化输出
for i in range(len(x)):
plt.text(x[i], y[i], {':.0%'}.y[i], ha='center', va='bottom')
plt.show()
ha 水平对齐方式 参数值 center left right
文字注释
plt.text()
plt.annotate()
其他
marker设置
plt.scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None,
faceted=True, verts=None, hold=None, **kwargs)
具体绘制案例及代码
常用图表
- 点 散点图 scatter 相关性 数值型数据
- 线 折线图 plot 趋势图 时间序列数据
- 柱 柱状图 bar 分类 分组查看数据
- 多维 热力图 heat 多维度数据 颜色热力图
- 其他 box箱线图 hist直方图 pie饼图 area 面积图
1、柱状图
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
num_list = [1.5,0.6,7.8,6]
plt.bar(range(len(num_list)), num_list)
plt.show()
2、并列柱状图
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
name_list = ['Monday','Tuesday','Friday','Sunday']
num_list = [1.5,0.6,7.8,6]
num_list1 = [1,2,3,1]
x =list(range(len(num_list)))
total_width, n = 0.8, 2
width = total_width / n
plt.bar(x, num_list, width=width, label='boy',fc = 'y')
for i in range(len(x)):
x[i] = x[i] + width
plt.bar(x, num_list1, width=width, label='girl',tick_label = name_list,fc = 'r')
plt.legend()
plt.show()
横向柱状图
x = ['A', 'B', 'C', 'D']
y = [1, 2, 3, 4]
plt.barh(x, y)
plt.show()
3 相关性矩阵图
import seaborn as sns
import matplotlib.pyplot as plt
df = sns.load_dataset('iris')
corr = df.corr()
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.show()