2-Matplotlib教程
1.matplotlib
import matplotlib.pyplot as plt
figure=plt.figure(figsize=(10,6))
plt.subplot(221) # 子图
plt.grid() # 网格
plt.axis([-1,8,-2,2]) # 坐标范围,x,y一起设置或者plt.xlim([-1,8]),plt.ylim([1,2])
plt.plot(x,y,x1,y1,label='sin(x)') # 画图,画在离它最近的画布上去
plt.xlabel("data"
#,color='blue'
#, rotation=90
#, fontdict={"fontsize":30}
) # x轴的标签,纵轴标签默认是90°
plt.ylabel("value") # y轴的标签
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi]) # x轴刻度,最好设置在显示的范围内
plt.xticks([0,1,2,3,4],["lucy","tom","jack","mery","lilei"],fontdict={
"color":"green",
"fontsize":15,
"rotation":20 #旋转角度
}) # 替换掉原有的刻度
plt.title("SIN",loc="left", rotation=30, fontsize=20) # 设置标题
plt.legend(loc=10) # 设置图例,位置0~10
plt.subplot(224) # 子图
plt.show() # 代表一个画板画图结束
figure.savefig('sin.png') # 保存图片
1.直方图
plt.hist(df.people,bins=8)
df.people.plot(kind='hist',bins=8)
2.柱状图
plt.bar(df.country,df.people,color=np.random.random((4,3)))
df.people.plot(kind='bar',color=np.random.random((4,3)))
3.饼状图
plt.pie([190,60,30],labels=['A','B','C'],autopct='%2.1f')
df.people.plot(kind='pie',autopct='%2.1f')
4.散点图
plt.scatter([10,20,30], [88,30,99], marker='H',s=50, color=np.random.random((3,3)))
df.plot(kind='scatter',x='people',y='asd')
5.箱线图
plt.boxplot(np.random.randint(0,100,100))
df.people.plot(kind='box')
1.1 matplotlib基础知识
Matplotlib中的基本图表包括的元素
-
x轴和y轴 ,axis 水平和垂直的轴线
-
轴标签 ,axisLabel 水平和垂直的轴标签
-
x轴和y轴刻度, tick 刻度标示坐标轴的分隔,包括最小刻度和最大刻度
-
x轴和y轴刻度标签, tick label 表示特定坐标轴的值
-
绘图区域(坐标系), axes 实际绘图的区域
-
画布 figure 呈现所有的坐标系
1.1.1 只含单一曲线
可以使用多个plot函数(推荐),在一个图中绘制多个曲线
用Series绘图:
%matplotlib inline # 不用再plt.show()即可显示图像
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
price = Series(data=np.random.randint(100,200, size=10), index=np.arange(10))
price.plot()
用DataFrame绘图:
prices = DataFrame(data={
"BGY":np.random.randint(100,200,size=(10,)),
"SMQH":np.random.randint(100,200,size=(10)),
"LYHG":np.random.randint(100,200,size=(10))
})
prices.plot() # 一个图中有三条折线,并且含有图例(“BGY”)....
只绘制线型图:
x = np.array([1,2])
y = np.array([4,8])
plt.plot(x, y) # 一条倾斜的直线
x = np.arange(10)
y = 2*x
plt.plot(x, y) # 一条倾斜的直线
画sin函数图:
x = np.linspace(0, np.pi*2, 100)
y = np.sin(x)
# 绘制一条线 (要找到x, y之间的对应关系)
plt.plot(x, y)
绘制线型图,x必须是有序的,从小到大排序:
x = np.sort(np.random.randint(0,10,size=10))
y = np.random.randint(0,10,size=10)
plt.plot(x, y) # 一条折线
也可以在一个plot函数中传入多对X,Y值,在一个图中绘制多个曲线:
# 绘制多条线
x = np.linspace(0,2*np.pi, 100)
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x)) # 一个图上有sinx、cosx图像
plt.plot(x, np.sin(x), x, np.cos(x), x, 0.5*x) # 也可以同时画
1.1.2 获取画板对象
figure语法说明
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
- num:图像编号或名称,数字为编号 ,字符串为名称
- figsize:指定figure的宽和高,单位为英寸;
- dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
- facecolor:背景颜色
- edgecolor:边框颜色
- frameon:是否显示边框
x = np.linspace(-np.pi, np.pi, 100)
# 如果没有显示创建这个画板对象,cell中也会自动维护一个画板
figure = plt.figure(figsize=(5,2))
# 如果没有特殊的处理,一个cell中的所有图像,都默认显示在同一个画板中
plt.plot(x, np.sin(x)) # 设置此行代码之前的所有图像进行显示,如果没设置,会在cell末尾自动显示图像
plt.show()
plt.plot(x, np.cos(x)) # 先后显示两图
1.1.3 设置字画布
画板–>画布–>呈现图像
- 画布和画板一样,如果不需要做一些额外设置,不需要显示调用它
- 常用的操作是对画板进行分区,就要配置画布的位置
axes = plt.subplot(111) # 一行一列个画布
# 调整画布的大小,可以通过调整画板来实现
plt.figure(figsize=(10,6))
axes1 = plt.subplot(221)
# 在不同的画布中,绘制不同的图像
# 1. 上下文原则: 绘图函数会默认把图像绘制到离它最近的那个画布上去
plt.plot(x, np.sin(x))
# 2. 使用面向对象的方式绘制
axes1.plot(x, np.cos(x))
axes2 = plt.subplot(2,2,2) # 同plt.subplot(222)
axes3 = plt.subplot(2,2,3)
axes4 = plt.subplot(2,2,4) # 1行1列有sinx和cosx图像
plt.figure(figsize=(14,7))
plt.subplot(221)
plt.plot(x,np.sin(x))
plt.subplot(224)
plt.plot(x,np.cos(x)) # 2行2列,两个图在对角线
1.1.4 网格线
plt.grid() # 有网格的画板
plt.figure(figsize=(10,6))
axes1 = plt.subplot(221)
plt.grid()
axes2 = plt.subplot(2,2,2)
plt.grid(linewidth=3)
axes3 = plt.subplot(2,2,3)
# plt.grid(color='#aaffdd')
plt.grid(color=np.random.random(3))
axes4 = plt.subplot(2,2,4)
axes4.grid(axis='x', alpha=0.3, color='red') # x方向无线条
#1. HTML颜色名称(支持简称) red blue green yellow yellowgreen purple darkgray lightgray gray
#2. 十六进制字符串 "#00aaff"
#3. RGB元组(0-1)float32 (0-255)uint8 np.random.random((8,3))
# jpg代表的: 三个0-255 uint8类型的整数
# png代表的: 三个0-1 float32类型的小数
# retina
random_image = np.random.randint(0,255,size=(100,100,3), dtype=np.uint8)
plt.imshow(random_image)
random_image2 = np.random.random(size=(100,100,3))
random_image2.dtype
plt.imshow(random_image2)
使用plt.grid方法可以开启网格线,使用plt面向对象的方法,创建多个子图显示不同网格线
- lw代表linewidth,线的粗细
- alpha表示线的明暗程度
- color代表颜色
- axis显示轴向
1.1.5 坐标界限
plt.axis([xmin,xmax,ymin,ymax])
# 坐标轴的界限默认有图像的内容确定
x = np.linspace(0, 2*np.pi, 100)
#axes = plt.subplot(111)
#plt.axis([-1,8,-2,2]) # x,y一起设置
plt.plot(x, np.sin(x))
#axes.axis([-2,10,-3,3])
# 单独对横轴和纵轴的边界处理
plt.plot(x, np.sin(x))
plt.xlim([-1, 8])
plt.ylim([-2,2])
# 单独对横轴和纵轴的边界处理(使用set函数)
axes = plt.subplot(111)
plt.plot(x, np.sin(x))
axes.set_xlim([-1, 8])
axes.set_ylim([-2,2])
plt.axis('xxx') 'tight'、'off'、'equal'……
# 设置坐标轴类型
# 关闭坐标轴
画圆:
# plt.figure(figsize=(5,5))
x = np.linspace(-1,1, 100)
y = (1-x**2)**0.5
plt.plot(x, y)
plt.plot(x, -y)
# # 调整横纵轴的比例 equal, scaled
plt.axis('equal')
# 强制渲染前面的绘图代码
# plt.axis('off') # 两个轴是否显示
#plt.show()
xlim方法和ylim方法
除了plt.axis方法,还可以通过xlim,ylim方法设置坐标轴范围
1.1.6 坐标标签
xlabel方法和ylabel方法
plt.ylabel(‘y = x^2 + 5’,rotation = 60)旋转
- color 标签颜色
- fontsize 字体大小
- rotation 旋转角度
x = np.linspace(0,2*np.pi, 100)
plt.plot(x, np.sin(x))
plt.xlabel("data"
#,color='blue'
#, rotation=90
#, fontdict={"fontsize":30}
)
# 纵轴标签默认是90°
plt.ylabel("value")
x = np.linspace(0,2*np.pi, 100)
axes = plt.subplot(111)
plt.plot(x, np.sin(x))
#面向对象的方式
axes.set_xlabel("data"
,color='blue'
, rotation=90
, fontdict={"fontsize":30}
)
# 纵轴标签默认是90°
axes.set_ylabel("value", fontsize=20)
1.1.7 X、Y轴坐标刻度
plt.xticks()和plt.yticks()方法
- 需指定刻度值和刻度名称 plt.xticks([刻度列表],[名称列表])
- 支持fontsize、rotation、color等参数设置
x = np.linspace(0,2*np.pi,100)
plt.plot(x, np.sin(x))
# params1: 要保留的刻度值(最好选择在数据的有效范围之内)
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
plt.show()
score = np.array([98,87,59,89,100])
plt.plot(np.arange(5),score)
# params2: 刻度标签
plt.xticks([0,1,2,3,4],["lucy","tom","jack","mery","lilei"]) # 替换掉原有的刻度
plt.show()
score = np.array([98,87,59,89,100])
axes = plt.subplot(111)
plt.plot(np.arange(5),score)
# 使用画布设定刻度位置
axes.set_xticks([0,1,2,3,4])
# 使用画布设定刻度标签
axes.set_xticklabels(["lucylucylucy","tomtomtomtom","jackjackjack","merymerymery","lileilileililei"],fontdict={
"color":"green",
"fontsize":15,
"rotation":20 #旋转角度
})
plt.show()
x = np.linspace(0,2*np.pi,100)
plt.plot(x, np.sin(x))
# params1: 要保留的刻度值(最好选择在数据的有效范围之内)
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi],["0","π/2","π","3π/2","2π"])
plt.yticks([-1,0,1],["min","middle","max"], fontsize=15, color='red')
plt.show()
1.1.8 画布标题
plt.title()方法
axes.set_title()
- loc {left,center,right}
- color 标签颜色
- fontsize 字体大小
- rotation 旋转角度
plt.figure(figsize=(10,3))
ax1 = plt.subplot(1,2,1)
ax1.plot(x, np.sin(x))
plt.title("SIN",loc="left", color=np.random.random(3), fontsize=20)
ax2 = plt.subplot(1,2,2)
ax2.plot(x, np.cos(x))
ax2.set_title("COS", loc='right' ,rotation=30, color='red', fontsize=20)
plt.show() # 两块画布,两个图,两个标题,两种设置方式
1.1.9 图例-legend
#【推荐】添加图例的方法
plt.plot(x, np.sin(x), label="SIN(X)")
plt.plot(x, np.cos(x), label="COS(X)")
# 开启图例,图例会显示每一个绘图(不止plot)函数中的label参数的值显示出来
plt.legend()
plt.show()
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
plt.legend(["SINX","COSX"])
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 |
plt.plot(x, np.sin(x), label="SIN(X)")
plt.plot(x, np.cos(x), label="COS(X)")
# 开启图例,图例会显示每一个绘图(不止plot)函数中的label参数的值显示出来
# plt.legend(loc="upper right")
plt.legend(loc=10)
plt.show()
loc参数可以是2元素的元组,表示图例左下角的坐标
- [0,0] 左下
- [0,1] 左上
- [1,0] 右下
- [1,1] 右上
ncol参数
ncol控制图例中有几列,在legend中设置ncol,需要设置loc
plt.plot(x, np.sin(x), label="SIN(X)")
plt.plot(x, np.cos(x), label="COS(X)")
# 开启图例,图例会显示每一个绘图(不止plot)函数中的label参数的值显示出来
# plt.legend(loc="upper right")
plt.legend(loc=[0.8,0.4]
, ncol=2 # 调整图例显示,并排显示
)
plt.show()
# 图例也可以超过图的界限loc = (-0.1,0.9)
linestyle、color、marker
修改线条样式
1.1.10 保存图片
使用figure对象的savefig的函数
- filename
含有文件路径的字符串或Python的文件型对象。图像格式由文件扩展名推断得出,例如,.pdf推断出PDF,.png推断出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……) - dpi
图像分辨率(每英寸点数),默认为100 - facecolor
图像的背景色,默认为“w”(白色)
figure = plt.figure(figsize=(10,3), facecolor='orange')
x = np.linspace(0,2*np.pi, 100)
plt.plot(x, np.sin(x), label="SIN(X)")
plt.legend()
# 保存图片的背景色以savefig函数为准
figure.savefig('sin.png',dpi=50, facecolor='blue')
matplotlib常用的绘图元素的设置小结
- 画板对象 figure = plt.figuer(figsize)
- 画布对象 axes = plt.subplot(row, col, loc)
- 网格线 plt.grid() axes.grid()
- 轴设置、刻度标签 plt.axis([xmin, xmax, ymin, ymax]) 设置界限 plt.axis(‘equal’) 设置横纵轴比例 plt.axis(‘off’) 设置横纵轴的开启和关闭 plt.xlim() axes.set_xlim([]) plt.ylim() axes.set_ylim([])
- 轴标题 plt.xlabel(s, color, fontsize, rotation, fontdict) axes.set_xlabel() plt.ylabel() axes.set_ylabel()
- 画布标题 plt.title(s, color, fontsize, rotation, fontdict) axes.set_title(s, color, fontsize…)
- 刻度设置 plt.xticks([刻度值列表], [刻度标签列表]) plt.yticks([刻度值列表], [刻度标签列表])
axes.set_xticks([刻度值列表]) axes.set_xticklabels([刻度标签列表], color, fontsize…) axes.set_yticks([刻度值列表]) axes.set_yticklabels([刻度标签列表], color, fontsize…)
- 图例 所有的绘图函数中,都有一个参数叫label,用于接收图例标签,配合legend() plt.plot(xxx, label=“name”) plt.legend(loc, ncol, color, fontsize…)
1.2 设置plot的风格和样式
plot语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色、线型、点型等要素,语法形式为:
plt.plot(X, Y, ‘format’, …)
y = np.random.randint(10,20,size=(6))
# 画布背景色
plt.subplot(111, facecolor="yellow")
plt.plot(y, color="red", alpha=0.9, linestyle='None', marker='s')
点和线的样式
- 颜色:参数color或c
颜色值的方式
-
别名
- 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)
-
jpg png 区别
- 透明度:alpha参数
- 背景色:设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标系的背景色
- 线型:参数linestyle或ls
线条风格 | 描述 | 线条风格 | 描述 |
---|---|---|---|
‘-’ | 实线 | ‘:’ | 虚线 |
‘–’ | 破折线 | ‘steps’ | 阶梯线 |
‘-.’ | 点划线 | ‘None’ / ‘,’ | 什么都不画 |
x = np.linspace(0,2*np.pi, 10)
style_dict = {
"-":"-",
"--":"--",
"-.":"-.",
":":":",
"steps":"steps",
"None":"None"
}
def show_lines():
padd = 0
for key, value in style_dict.items():
padd += 1
y = np.sin(x+padd)
# linestyle == ls
# linewdith == lw
plt.plot(x, y, linestyle=value, label=key, color=np.random.random(3), linewidth=padd)
plt.legend()
show_lines()
- 线宽:linewidth或lw参数
不同宽度的破折线
dashes参数 eg.dashes = [20,50,5,2,10,5]
设置破折号序列各段的宽度
dashes = [50, 30, 100, 40, 30, 5]
plt.plot(y, dashes=dashes, color=np.random.random(3), label="salary", lw=3)
plt.legend()
- 点型:marker 设置点形,markersize 设置点形大小
# 图形中有点才能设置点形
# 1. 线型图
# 2. 散点图
point = np.random.randint(5,20,size=10)
color = np.random.random(3)
# marker 点型
# markersize 点的大小
# markerfacecolor 点的主体颜色, 必须有面积
# markeredgecolor 点的边线颜色
# markeredgewidth 点的边线宽度
plt.plot(point, ls='None', marker='o', markersize=20, markeredgecolor=color, markerfacecolor='white')
plt.plot(point, ls='None', marker='2', markersize=20, color=color)
plt.show()
plt.plot(point, ls='None',marker='X', markersize=20, markerfacecolor='green')
plt.plot(point, ls='None',marker='|', markersize=40, markeredgecolor='green', markeredgewidth=5)
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘1’ | 一角朝下的三脚架 | ‘3’ | 一角朝左的三脚架 |
‘2’ | 一角朝上的三脚架 | ‘4’ | 一角朝右的三脚架 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘s’ | 正方形 | ‘p’ | 五边形 |
‘h’ | 六边形1 | ‘H’ | 六边形2 |
‘8’ | 八边形 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘.’ | 点 | ‘x’ | X |
‘*’ | 星号 | ‘+’ | 加号 |
‘,’ | 像素 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘o’ | 圆圈 | ‘D’ | 菱形 |
‘d’ | 小菱形 | ‘’,‘None’,’ ',None | 无 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘_’ | 水平线 | ‘|’ | 竖线 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
‘v’ | 一角朝下的三角形 | ‘<’ | 一角朝左的三角形 |
‘^’ | 一角朝上的三角形 | ‘>’ | 一角朝右的三角形 |
多参数连用
颜色、点型、线型,可以把几种参数写在一个字符串内进行设置 ‘r-.o’
# plt.plot(x, y, color, ls, lw, marker, markersize...)
# plt.plot(x1,y1, x2, y2, color, ls......)
# plt.plot(x1, y1, 'formatstring')
x = np.linspace(0, 2*np.pi, 20)
plt.plot(x, np.sin(x),'r--o', x, np.cos(x),'g-.s')
# 线和点的风格设置会影响到图例显示
plt.legend(["sin(x)", "cos(x)"])
plt.show()
更多点和线的设置
- markeredgecolor = ‘green’,
- markeredgewidth = 2,
- markerfacecolor = ‘purple’
参数 | 描述 | 参数 | 描述 |
---|---|---|---|
color或c | 线的颜色 | linestyle或ls | 线型 |
linewidth或lw | 线宽 | marker | 点型 |
markeredgecolor | 点边缘的颜色 | markeredgewidth | 点边缘的宽度 |
markerfacecolor | 点内部的颜色 | markersize | 点的大小 |
多个曲线同一设置
属性名声明,不可以多参数连用
plt.plot(x1, y1, x2, y2, fmt, …)
多个曲线不同设置
多个都进行设置时,多参数连用 plt.plot(x1, y1, fmt1, x2, y2, fmt2, …)
三种设置方式
向方法传入关键字参数
- import matplotlib as mpl
对实例使用一系列的setter方法
- plt.plot()方法返回一个包含所有线的列表,设置每一个线需要获取该线对象
- eg: lines = plt.plot(); line = lines[0]
- line.set_linewith()
- line.set_linestyle()
- line.set_color()
对坐标系使用一系列的setter方法
- axes = plt.subplot()获取坐标系
- set_title()
- set_facecolor()
- set_xticks、set_yticks 设置刻度值
- set_xticklabels、set_yticklabels 设置刻度名称
# 绘图元素主要对画布
axes = plt.subplot(111)
axes.set_title("AXES-TITLE")
line1, line2 = plt.plot(x, np.sin(x), x, np.cos(x))
# line1.color = "red"
line1.set_color("red")
line1.set_linewidth(3)
line1.set_marker('h')
line1.set_markersize(15)
line2.set_linestyle('--')
line2.set_color("blue")
字体设置
import matplotlib as mpl
import matplotlib.pyplot as plt
# 获取全局外观属性配置的字典
mpl.rc_params()
1.全局设置
# 全局的
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 或者plt.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams["axes.facecolor"] = "orange" # axes:画布
- 恢复默认设置 mpl.rcdefaults()
- 设置风格 mpl.style.use(‘seaborn-darkgrid’)
- 获取所有风格样式 mpl.style.available
常用字体:
黑体 SimHei 仿宋 FangSong 楷体 KaiTi
# 设置汉字显示一般还要同时设定一下负号的问题
mpl.rcParams['font.sans-serif'] = "KaiTi"
mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.title("杨坤diss惊雷", color='green', fontsize=20)
2.加载自定义字体,设置局部
# ttf文件格式,提供艺术字体
from matplotlib import font_manager
# ttf加载方案 所有平台通用的艺术字格式
my_font = font_manager.FontProperties(fname = '辣鸡心心体.ttf')
my_font
plt.title("张飞的故事", fontproperties=my_font, fontsize=20, color='green')
1.3 2D图形
1.3.1 直方图
【直方图的参数只有一个x!!!不像条形图需要传入x,y】
hist()的参数
- bins
直方图的长条形数目,可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10 - density 如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False
参数 | 语法 | 功能 |
---|---|---|
x | (n,) array or sequence of (n,) arrays | 数据源 |
bins | integer or array_like | 分块数,默认10 |
range | tuple or None, optional | 画图范围,接收元组 |
normed | boolean, optional | 概率分布,是否正则化 |
weights | (n, ) array_like or None, optional | 均一化相关 |
cumulative | boolean, optional | 每一列累加 |
bottom | array_like, scalar, or None | bin的基线 |
histtype | {‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’}, optional | 画图的形状,默认是bar |
align | {‘left’, ‘mid’, ‘right’}, optional | bar中心位置,默认中间 |
orientation | {‘horizontal’, ‘vertical’},optional | 水平或垂直,默认垂直 |
rwidth | scalar or None, optional | bar的宽度 |
log | boolean, optional | 是否启用对数作为刻度 |
color | color or array_like of colors or None, optional | 表示bar的颜色 |
label | string or None, optional | bar的标签;也可以在图例中写plt.legend() |
stacked | boolean, optional | 是否接收多个输入源 |
data = np.random.randn(1000)
# 每一个柱形表达的数据范围是由bins和数据的上下边界共同决定的,跟柱形的宽度没关系
plt.hist(data, bins=5, rwidth=0.6, density=True, color=np.random.random(3), label="data")
# matplotlib没有kde接口,所以要使用seaborn来绘制
#sns.kdeplot(data, color="red", label="kde")
plt.legend()
plt.hist(data, bins=5, orientation='horizontal')
1.3.2 条形图
条形图有两个参数x,y】
- width 纵向设置条形宽度
- height 横向设置条形高度
bar()、barh()
参数 | 语法 | 功能 |
---|---|---|
x | sequence of scalars | 数据源 |
height | scalar or sequence of scalars | bar的高度 |
width | scalar or array-like, optional | bar的宽度,默认0.8 |
bottom | scalar or array-like, optional | y轴的基准,默认0 |
align | {‘center’, ‘edge’}, optional, default: ‘center’ | x轴的位置,默认中间,edge表示将bar的左边与x对齐 |
color | scalar or array-like, optional | bar颜色 |
edgecolor | scalar or array-like, optional | 边颜色 |
linewidth | scalar or array-like, optional | 边的宽度,0表示无边框 |
tick_label | string or array-like, optional | 标签,默认无,使用数字标签 |
xerr, yerr | scalar or array-like of shape(N,) or shape(2,N), optional | 误差线 |
ecolor | scalar or array-like, optional, default: ‘black’ | 误差线的颜色,默认黑 |
capsize | scalar, optional | 误差线的长度,默认无,自动获取 |
error_kw | dict, optional | 通过字典项传递错误bar |
log | bool, optional, default: False | 为真表示y轴以log对象做刻度,默认假 |
orientation | {‘vertical’, ‘horizontal’}, optional | 垂直还是水平,默认垂直 |
data = [100,200,140,160]
names = ["lucy","mery","tom","jack"]
# 柱状图的颜色可以随机多次设置
plt.bar(x=names, height=data, width=0.7, color=np.random.random((4,3)))
money = np.random.randint(100,300,size=100)
plt.bar(x=np.arange(100), height=money, color=np.random.random((5,3)))
plt.figure(figsize=(5,20))
plt.barh(y=np.arange(100), width=money, color=np.random.random((100,3)), height=0.9)
plt.yticks(np.arange(100))
plt.show()
玫瑰图/极坐标条形图
创建极坐标,设置polar属性
- plt.axes(polar = True)
data = np.random.randint(3,10,size=8)
plt.bar(x=np.arange(8), height=data)
plt.axes(polar=True)
# 极坐标的坐标系范围是固定的 0-2π
# 极坐标的“横轴”坐标刻度是用弧度表示的
x = np.linspace(0,2*np.pi, 8, endpoint=False)
plt.bar(x=x, height=data, color=np.random.random((8,3)), align = 'edge')
1.3.3 饼图
【饼图也只有一个参数x!】
pie()
饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小
参数 | 语法 | 功能 |
---|---|---|
explode | [ None | len(x) sequence ] | 接收小数的列表,表示每一块饼与圆心的距离,即单独移动一块饼凸现出来 |
colors | [ None | color sequence ] | 每块饼的颜色,列表 |
labels | [ None | len(x) sequence of strings ] | 饼的标签,列表 |
autopct | [ None | format string | format function ] | 每块饼的占比,百分数,%2.1f%保留一位小数 |
pctdistance | scalar | 每块饼占比与圆心的距离,默认0.6 |
labeldistance | scalar | 饼的标签与圆心的距离 |
shadow | [ False | True ] | 是否显示阴影 |
startangle | [ None | Offset angle ] | 位置偏移的起始角度,常用90 |
radius | [ None | scalar ] | 直径的大小,默认为1 |
counterclock | [ False | True ] | 逆时针或顺时针 |
wedgeprops | [ None | dict of key value pairs ] | 字典指定饼的属性 |
textprops | [ None | dict of key value pairs ] | 字典指定文本属性 |
center | [ (0,0) | sequence of 2 scalars ] | 圆心位置,接收元组 |
numbers = [190, 60]
plt.pie(numbers)
plt.axis('equal')
plt.show()
numbers = [190, 60, 110]
plt.pie(numbers, colors=np.random.random((3,3)),
labels = ["李磊","王晓","子轩"],
labeldistance = 0.8,
autopct = "%1.1f%%",
pctdistance = 0.3,
explode = [0,0,0.2],
shadow=True,
startangle = 180
)
plt.axis('equal')
plt.title("数据组成")
plt.show()
1.3.4 散点图
【散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标!】
scatter()
参数 | 语法 | 功能 |
---|---|---|
x, y | array_like, shape (n, ) | 数据源 |
s | scalar or array_like, shape (n, ), optional | 标记的大小 |
c | color, sequence, or sequence of color, optional, default: ‘b’ | 标记颜色,默认黑 |
marker | MarkerStyle, optional, default: ‘o’ | 标记的风格 |
cmap | Colormap, optional, default: None | 颜色模式,默认为 rc image.cmap |
norm | Normalize, optional, default: None | 归一化相关 |
vmin, vmax | scalar, optional, default: None | 规范最大值和最小值的显示模式 |
alpha | scalar, optional, default: None | 0透明,1不透明 |
linewidths | scalar or array_like, optional, default: None | 标记边缘线的宽度,默认无 |
verts | sequence of (x, y), optional | marker 为None时,使用这些点做标记 |
edgecolors | color or sequence of color, optional, default: ‘face’ | 标记的边缘颜色 |
x = np.random.randint(0,100,size=10)
y = np.random.randint(0,100,size=10)
# 散点图的点的大小 使用s设置
plt.scatter(x, y, marker='H',s=100, color=np.random.random((10,3)))
import seaborn as sns
tips = sns.load_dataset('tips')
tips.head()
tips.day.unique()
plt.scatter(x=tips.day, y=tips.tip)
1.3.5 箱线图
data = np.random.randn(100)
plt.hist(data)
# 过滤异常值
# 1. 3倍标准差
# 2. 离群点检测
plt.boxplot(data)
plt.show()
import seaborn as sns
tips = sns.load_dataset('tips')
tips
plt.scatter(x=tips.day, y=tips.tip)
# 离散值和连续值之间的对应关系可以采用箱线图表示
for day in tips.day.unique():
part_tips = tips.query("day == '{}'".format(day))
plt.boxplot(part_tips.tip)
plt.title(day)
plt.show()
1.删除离群点
plt.boxplot(tips.tip)
plt.show()
result = tips.tip.quantile([0.25, 0.5, 0.75])
Q1 = result.iloc[0]
Q3 = result.iloc[2]
IQR = Q3 - Q1
UPPER = Q3 + 1.5*IQR
BOTTOM = Q1 - 1.5*IQR
# 可以使用上边界的值来填充超过上边界的离群点,不要使用max,min
data = tips.tip.copy()
data.loc[data > UPPER] = UPPER
data.loc[data < BOTTOM] = BOTTOM
plt.boxplot(data)
plt.show()
tips.tip.values
2.填充 上边界的值填充上边的离群点 下边界的值填充下边的离群点
1.4 图形内的文字、注释、箭头
控制文字属性的方法:
pyplot函数 | API方法 | 描述 |
---|---|---|
text() | mpl.axes.Axes.text() | 在Axes对象的任意位置添加文字 |
xlabel() | mpl.axes.Axes.set_xlabel() | 为X轴添加标签 |
ylabel() | mpl.axes.Axes.set_ylabel() | 为Y轴添加标签 |
title() | mpl.axes.Axes.set_title() | 为Axes对象添加标题 |
legend() | mpl.axes.Axes.legend() | 为Axes对象添加图例 |
figtext() | mpl.figure.Figure.text() | 在Figure对象的任意位置添加文字 |
suptitle() | mpl.figure.Figure.suptitle() | 为Figure对象添加中心化的标题 |
annnotate() | mpl.axes.Axes.annotate() | 为Axes对象添加注释(箭头可选) |
所有的方法会返回一个matplotlib.text.Text对象
x = np.linspace(0,2*np.pi, 100)
figure = plt.figure(figsize=(10,4), facecolor='lightgray')
ax1 = plt.subplot(1,2,1, facecolor='cyan')
ax1.plot(x, np.sin(x))
ax1.text(x=3.5, y=0.8, s="this is a sin(x) of score", fontdict={
"fontsize":12,
"color":"r"
})
# xy 箭头指向的点
# xytext 文字的摆放位置
ax1.annotate(s="min value", xy=[3*np.pi/2, -1], xytext=[2,0], arrowprops={
"arrowstyle":"->"
})
ax2 = plt.subplot(1,2,2, facecolor='orange')
ax2.plot(x, np.cos(x))
ax2.annotate(s="max value", xy=[0,1], xytext=[3, 0.15], arrowprops={
"width":3,
"headlength":5,
"headwidth":6,
"color":"red"
})
figure.suptitle("FIGURE TITLE", color='red')
# 画板的坐标位置的描述是相对值0-1
figure.text(x=0.5, y=0.01, s="adjfk asldkfjalsdf jk\nl;akdjflakjl kjkjalsdkfj", fontdict={
"fontsize":25
})
图形内的文字
text()
注释
annotate()
- xy参数设置箭头指示的位置
- xytext参数设置注释文字的位置
- arrowprops参数以字典的形式设置箭头的样式
- width参数设置箭头长方形部分的宽度
- headlength参数设置箭头尖端的长度,
- headwidth参数设置箭头尖端底部的宽度
- shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值),可以理解为控制箭头的长度
如下都是arrowstyle可以选择的风格样式
``'->'`` head_length=0.4,head_width=0.2
``'-['`` widthB=1.0,lengthB=0.2,angleB=None
``'|-|'`` widthA=1.0,widthB=1.0
``'-|>'`` head_length=0.4,head_width=0.2
``'<-'`` head_length=0.4,head_width=0.2
``'<->'`` head_length=0.4,head_width=0.2
``'<|-'`` head_length=0.4,head_width=0.2
``'<|-|>'`` head_length=0.4,head_width=0.2
``'fancy'`` head_length=0.4,head_width=0.4,tail_width=0.4
``'simple'`` head_length=0.5,head_width=0.5,tail_width=0.2
``'wedge'`` tail_width=0.3,shrink_factor=0.5
漏斗图
#绘制漏斗流失图
import pyecharts.options as opts
from pyecharts.charts import Funnel
x_data = [ "点击", "加入购物车", "收藏", "支付"]
y_data = [987911, 29427, 20997, 10240]
data = [[x_data[i], y_data[i]] for i in range(len(x_data))]
c = (Funnel().add("商品",data,label_opts=opts.LabelOpts(position="inside"),).set_global_opts(title_opts=opts.TitleOpts(title="漏斗流失图")))
c.render_notebook()