Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发。
matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式。示例:
import matplotlib.pyplot as plt
# 包含五个元素列表的一个图形
#如果输入的参数只是一个一维的列表,那么这个数组会被当成y轴处理,x轴是列表的索引
plt.plot([1,5,8,2,5])
plt.ylabel("grade") #y轴增加标签
plt.savefig('te01',dpi=600) #dpi是指每个英寸包含600个像素点(质量挺高的了)
plt.show()
图像结构
三层结构
图像层
正式绘图(直方图、折线图、散点图、饼状图)
辅助显示层
用户可以设置添加标题、网格、图例等对图形的描述信息
容器层主要由 Canvas、Figure、Axes 组成。
Canvas 是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布 (Figure) 的工具。
Figure 是 Canvas 上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色。
Axes 是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。
特点:
一个figure (画布)可以包含多个 axes (坐标系/绘图区), 但是一个axes 只能属于一个 figure。
一个 axes (坐标系/绘图区)可以包含多个 axis (坐标轴), 包含两个即为2d坐标系,3个即为3d坐标系
容器层
plot() 用于画图它可以绘制点和线,语法格式如下:
# 画单条线
plot([x], y, [fmt], *, data=None, **kwargs)
# 画多条线
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
参数说明:
x:X轴数据,列表或数组,可选(绘制多条曲线时,各条曲线的x不能省略)
y:Y轴数据,列表或数组
format_string:控制曲线的格式字符串(由颜色字符、风格字符和标记字符组成),可选
颜色字符 | |||
---|---|---|---|
颜色字符 | 说明 | 颜色字符 | 说明 |
'b' | 蓝色 | 'm' | 洋红色 magenta |
'g' | 绿色 | 'y' | 黄色 |
'r' | 红色 | 'k' | 黑色 |
'c' | 青绿色 cyan | 'w' | 白色 |
'#008000' | RGB某颜色(十六进制色彩) | '0.8' | 灰度值字符串 |
风格字符 | |||
风格字符 | 说明 | 风格字符 | 说明 |
'-' | 实线 | ':' | 虚线 |
'--' | 破折线 | '' ' ' | 无线条 |
'-.' | 点划线 | ||
标记字符 | |||
标记字符 | 说明 | 标记字符 | 说明 |
'.' | 点标记 | 's' | 实心方形标记 |
',' | 像素标记(极小点) | 'p' | 实心五角标记 |
'o' | 实心圈标记 | '*' | 星形标记 |
'v' | 倒三角标记 | 'h' | 竖六边形标记 |
'^' | 上三角标记 | 'H' | 横六边形标记 |
'>' | 右三角标记 | '+' | 十字标记 |
'<' | 左三角标记 | 'x' | x标记 |
'1' | 下花三角标记 | 'D' | 菱形标记 |
'2' | 上花三角标记 | 'd' | 瘦菱形标记 |
'3' | 左花三角标记 | '|' | 垂直线标记 |
'4' | 右花三角标记 |
**kwargs:第二组或更多(x, y, format_string)
color:控制颜色,color='green'
linestyle:线条风格,linestyle='dashed'
marker:标记风格,marker='o'
markerfacecolor:标记颜色,markerfacecolor='blue'
marksize,标记尺寸,markerfacecolor=20
#1.创建画布
plt.figure()
#2.绘制图像
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])
#3.显示图像
plt.show()
plt.figure(figsize=(),dpi=)
figsize:指定图的长宽
dpi:图像的清晰度
plt.savefig(path)
#1.创建画布
plt.figure(figsize=(20,8),dpi=80)
#2.绘制图像
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])
plt.save("test.png")
plt.show()会释放资源,如果在显示图像之后保存图片将只能保存空图片
plt.xticks(x, **kwargs)
x:要显示的刻度值
plt.yticks(y,**kwargs)
y:要显示的刻度值
#1.准备数据
import random
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
#2.创建画布
plt.figure(figsize=(20,8),dpi=80)
#3.绘制图像
plt.plot(x,y_shanghai)
#修改xy刻度
#准备x的刻度说明
x_label = ["11点{}分".format(i) for i in x]
#label与x一一对应
plt.xticks(x[::5],x_label[::5])
plt.yticks(range(0,40,5))
#4.显示图像
plt.show()
中文显示问题
原因:字体本身就不支持中文
解决:
安装字体
双击安装simhei.ttf 下载地址:Download SimHei Font - Thousands of fonts to download for free
删除matplotlib缓存文件
配置文件
plt.grid(True,linestyle='--',alpha=0.5)
一般的 ture 显示默认,为是否添加网格,linestyle 为线条风格,显示为虚线。Alpha 为透明度。
添加 x 轴,y 轴描述信息及标题。
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("标题" )
函数 | 说明 |
---|---|
plt.xlabel() | 对X轴增加文本标签 |
plt.ylabel() | 对Y轴增加文本标签 |
plt.title() | 对图形整体增加文本标签 |
plt.text() | 在任意位置增加文本 |
plt.annotate() | 在图形中增加带箭头的注解 |
多个折线
import random
import matplotlib.pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='msyh.ttc') # 拷贝过来的字体文件
x = range(60)
y_beijing = [random.uniform(15,18) for i in x]
y_shanghai = [random.uniform(15,18) for i in x]
#2.创建画布
plt.figure(figsize=(20,8),dpi=80)
#3.绘制多个折线
plt.plot(x,y_shanghai,color='r')
plt.plot(x,y_beijing,color='b')
#修改xy刻度
#准备x的刻度说明
x_label = ["11点{}分".format(i) for i in x]
#label与x一一对应
plt.xticks(x[::5],x_label[::5],fontproperties=my_font)
plt.yticks(range(0,40,5))
#4.显示图像
plt.show()
显示图例
plt.legend()
plt. legend(Loc="best")
#Location String:'best'、'upper right'、'upper left'、'lower left'、'lower right' 等等
#Location Code:0、1、2、3、4
#如果想在左下角显示,具体操作如下:
# 显示图例
plt.legend(loc=“lower left”)
#图例出现在左下角。
#用数字代替也可以。
# 显示图例
plt.legend(loc=4)
plt.subplots(nrows=1, ncols=1, **fig_kw)
创建一个带有多个 axes(坐标系/绘图区)的图,返回一个画布figure和绘图区axes。
figure,axes = plt.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
#axes[0]为第一个绘图区 以此类推
nrows:默认为 1,设置图表的行数。
ncols:默认为 1,设置图表的列数。
sharex、sharey:设置 x、y 轴是否共享属性,默认为 false,可设置为 'none'、'all'、'row' 或 'col'。 False 或 none 每个子图的 x 轴或 y 轴都是独立的,True 或 'all':所有子图共享 x 轴或 y 轴,'row' 设置每个子图行共享一个 x 轴或 y 轴,'col':设置每个子图列共享一个 x 轴或 y 轴。
squeeze:布尔值,默认为 True,表示额外的维度从返回的 Axes(轴)对象中挤出,对于 N1 或 1N 个子图,返回一个 1 维数组,对于 N*M,N>1 和 M>1 返回一个 2 维数组。如果设置为 False,则不进行挤压操作,返回一个元素为 Axes 实例的2维数组,即使它最终是1x1。
subplot_kw:可选,字典类型。把字典的关键字传递给 add_subplot() 来创建每个子图。
gridspec_kw:可选,字典类型。把字典的关键字传递给 GridSpec 构造函数创建子图放在网格里(grid)。
**fig_kw:把详细的关键字参数传给 figure() 函数。
面向对象的方法:axes.set_方法名()
eg:
set_ xticks
set_ yticks
set_ xlabel
set_ ylabel
import random
import matplotlib.pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='msyh.ttc') # 拷贝过来的字体文件
x = range(60)
y_beijing = [random.uniform(15,18) for i in x]
y_shanghai = [random.uniform(15,18) for i in x]
#2.创建画布
# plt.figure(figsize=(20,8),dpi=80)
#创建多个子图
figure,axes = plt.subplots(nrows=1, ncols=2,figsize=(20,8),dpi=80)
#3.绘制图像
axes[0].plot(x,y_shanghai)
axes[1].plot(x,y_beijing)
#修改xy刻度
#准备x的刻度说明
x_label = ["11点{}分".format(i) for i in x]
#label与x一一对应
axes[0].set_xticks(x[::5])
axes[0].set_xticklabels(x_label[::5],fontproperties=my_font)
axes[0].set_yticks(range(0,40,5))
axes[1].set_xticks(x[::5])
axes[1].set_xticklabels(x_label[::5],fontproperties=my_font)
axes[1].set_yticks(range(0,40,5))
#4.显示图像
plt.show()