数据科学、数据分析、人工智能、数学建模必备知识汇总-----Matplotlib-----持续更新

数据科学、数据分析、人工智能、数学建模必备知识汇总-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/140174015

一、入门

一款用于数据可视化的Python软件包,支持跨平台,能够根据NumPy的ndarray数组绘制2D(3D)图像,使用简单、代码也清晰易懂

1. 第一个Matplotlib程序

  • 导入Matplotlib包中的Pyplot模块,并以as别名为plt
from matplotlib import pyplot as plt
  • 接下来,使用NumPy提供的函数arange()创建一组数据用来绘制图像
# 引入numpy包
import numpy as np
# 获得-50到50之间的ndarray对象
x = np.arange(-50,50)

在这里插入图片描述

  • 利用numpy数组广播的性质,实现 y = x 2 y = x^2 y=x2 x ∈ ( − 50 , + 50 ) x∈(-50,+50) x(50,+50)
y=x**2

在这里插入图片描述

  • plot()函数直接绘制关于x和y的图表
# plot()函数绘制线条
plt.plot(x,y)

在这里插入图片描述

2. matplotlib基本方法

方法名描述
title()设置图表的名称
xlabel()设置x轴名称
ylabel()设置y轴名称
xticks(ticks,label,rotation)设置x轴的刻度,rotation旋转角度
yticks()设置y轴的刻度
show()显示图表
legend()显示图例
text(x,y,text)显示每条数据的值,并指定x,y值的位置

2.1 图表名称 plt.title()

# 引入numpy包
import numpy as np
# 获得-50到50之间的ndarray对象
x = np.arange(-50,50)
y=x**2
# 为图表定义名称
plt.title("y=x^2")
# plot()函数绘制线条
plt.plot(x,y)

在这里插入图片描述

2.2 修改字体配置以显示中文

  • 修改字体配置 plt.rcParams[“font.sans-serif”]
中文字体描述
‘SimHei’中文黑体
‘Kaiti’中文楷体
‘LiSu’中文隶书
‘FangSong’中文仿宋
‘YouYuan’中文幼圆
‘STSong’华文宋体
  • 可见虽然可以正常显示中文,但是负号不显示了
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
# 获得-50到50之间的ndarray对象
x = np.arange(-50,50)
y=x**2
# 设置为黑体
plt.rcParams['font.sans-serif']=['SimHei']
# 为图表定义名称
plt.title("y等于x的平方")
# plot()函数绘制线条
plt.plot(x,y)

在这里插入图片描述

  • 所以我们需要额外对轴axes中的负号编码unicode_minus进行设置,置为False
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
# 获得-50到50之间的ndarray对象
x = np.arange(-50,50)
y=x**2
# 设置为黑体
plt.rcParams['font.sans-serif']=['SimHei']
# 设置轴中负号编码
plt.rcParams['axes.unicode_minus']=False
# 为图表定义名称
plt.title("y等于x的平方")
# plot()函数绘制线条
plt.plot(x,y)

在这里插入图片描述

2.3 x轴和y轴名称

  • xlabel()和ylabel()两个函数分别设置x轴和y轴标签名
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
# 获得-50到50之间的ndarray对象
x = np.arange(-50,50)
y=x**2
# 设置为黑体
plt.rcParams['font.sans-serif']=['SimHei']
# 设置轴中负号编码
plt.rcParams['axes.unicode_minus']=False
# 设置x和y轴标签名
plt.xlabel("x轴")
plt.ylabel("y轴")
# 为图表定义名称
plt.title("y等于x的平方")
# plot()函数绘制线条
plt.plot(x,y)

在这里插入图片描述

  • 也可以指定一些属性,设置标签大小【例如plt.ylabel(“y轴”,fontsize=12)】,设置线条形状和颜色等等(后面会详细介绍)
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
# 获得-50到50之间的ndarray对象
x = np.arange(-50,50)
y=x**2
# 设置为黑体
plt.rcParams['font.sans-serif']=['SimHei']
# 设置轴中负号编码
plt.rcParams['axes.unicode_minus']=False
# 设置x和y轴标签名
plt.xlabel("x轴")
plt.ylabel("y轴",fontsize=12)
# 为图表定义名称
plt.title("y等于x的平方",fontsize=20)
# plot()函数绘制线条
plt.plot(x,y,linewidth=5,color='red')

在这里插入图片描述

2.4 一张画布画多条线

  • plot()方法是在画布上画线,可以调用多次画多条,下面分别画 y 1 = x 2 y_1 = x^2 y1=x2 y 2 = x y_2 = x y2=x
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
# 获得-50到50之间的ndarray对象
x = np.arange(-50,50)
y1=x**2
y2 = x
# 设置为黑体
plt.rcParams['font.sans-serif']=['SimHei']
# 设置轴中负号编码
plt.rcParams['axes.unicode_minus']=False
# 设置x和y轴标签名
plt.xlabel("x轴")
plt.ylabel("y轴",fontsize=12)
# 为图表定义名称
plt.title("y等于x的平方",fontsize=20)
# plot()函数绘制线条1
plt.plot(x,y1,linestyle='dashed',color='red')
# plot()函数绘制线条2
plt.plot(x,y2,color='blue')

在这里插入图片描述

2.5 设置x和y轴刻度

matplotlib.pyplot.xticks(ticks,labels, ∗ ∗ ** kwargs):将x轴变成自己想要的样子

  • ticks:位置列表,是一个可选参数,传入空列表时,将删除所有xticks
  • label:包含放置在给定刻度线位置的标签。可选参数
  • ∗ ∗ k w a r g s **kwargs kwargs:文本属性,用于控制标签外观
    • rotation:旋转角度
    • color:颜色
  • 下面例子是若干时间结点序列,每个时刻的出售量,可见由于时间结点的标签太长,导致x轴非常混乱
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
#每个时间点的销量绘图
times =['2015/6/26', '2015/8/1','2015/9/6','2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','20162016/5/15', '2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
#随机出销量
sales = np.random.randint(500,2000,size=len(times))
#绘制图形
plt.plot(times, sales)

在这里插入图片描述

  • plt.xticks(ticks=range(1,len(times),2),rotation=90)通过ticks参数指定标签只显示原来的一半,rotation指定标签旋转90°
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
#每个时间点的销量绘图
times =['2015/6/26', '2015/8/1','2015/9/6','2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','20162016/5/15', '2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
#随机出销量
sales = np.random.randint(500,2000,size=len(times))
# 只显示部分时间,或指定某规则展示
plt.xticks(ticks=range(1,len(times),2),rotation=90)
#绘制图形
plt.plot(times, sales)

在这里插入图片描述

  • tabels参数是将ticks指定的标签,替换为指定内容,那么数量必须和ticks长度匹配
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
#每个时间点的销量绘图
times =['2015/6/26', '2015/8/1','2015/9/6','2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','20162016/5/15', '2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
#随机出销量
sales = np.random.randint(500,2000,size=len(times))
# 只显示部分时间,或指定某规则展示
ticks=range(1,len(times),2) # 隔一个显示一个
labels = [times[i][2:] for i in ticks] #将内容替换,例如2015/6/26变为15/6/26
plt.xticks(ticks=ticks,labels = labels, rotation=90)
#绘制图形
plt.plot(times, sales)

在这里插入图片描述

2.6 show()显示图像,设置jupyter显示图像时,拥有交互模式

  • 因为jupyter是自动显示图像的,而我们平常写代码都需要调用特定的显示方法才行,例如plt.show()就是显示图像的方法
plt.show()

由plt.show()显示的图像是有交互功能的,jupyter怎么能如此显示呢?

  • 首先执行魔术方法%matplotlib notebook,将jupyter展示的图像显示形式设置为和正常写代码调用plt.show()一样的交互形式
%matplotlib notebook
  • 之后我们生成的图像就是交互式的

在这里插入图片描述

  • 如何回到普通形式显示呢?只需要执行%matplotlib inline,然后接下来生成的图像就是非交互式的
%matplotlib inline

在这里插入图片描述

2.7 图例legend()

集中在地图一角或一侧的关于地图上各种符号和颜色所代表内容与指标的说明,有助于我们区分

  • 每个图形的label值将会作为图例说明,而我们调用plt.legend()后,就会使用这些label值生成图例
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
#每个时间点的销量绘图
times =['2015/6/26', '2015/8/1','2015/9/6','2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','20162016/5/15', '2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
# 收入
income = np.random.randint(500,2000,size=len(times))
# 支出
expenses = np.random.randint(500,2000,size=len(times))
# 只显示部分时间,或指定某规则展示
ticks=range(1,len(times),2) # 隔一个显示一个
labels = [times[i][2:] for i in ticks] #将内容替换,例如2015/6/26变为15/6/26
plt.xticks(ticks=ticks,labels = labels, rotation=90)
#绘制图形
plt.plot(times, income, label = 'Income')
plt.plot(times, expenses, label = 'Expenses')
# 每个图形的label值将会作为图例说明
plt.legend()
plt.show()

在这里插入图片描述

  • 图例的位置设置

loc代表了图例在整个坐标轴平面中的位置(一般选取’best’参数值)

  1. 默认的best,图例自动安家,自己选一个不遮挡数据的地方放置
  2. 也可以通过loc='XXX’的形式找位置,XXX的相关可取值如下
    在这里插入图片描述
    在这里插入图片描述
plt.legend(loc='right')
位置字符串位置值描述
“best”0自动寻找最好的位置
“upper right”1右上角
“upper left”2左上角
“lower left”3左下角
“lower right”4右下角
“right”5右边中间
“center left”6左边中间
“center right”7右边中间
“lower center”8中间最下面
“upper center”9中间最下面
“center”10正中心

2.8 显示每条数据的值

  • plt.text(x,y,string,fontsize=15,ha=“right”,va=“top”)
  1. x,y:表示某坐标值
  2. string:表示说明文字
  3. fontsize:字体大小
  4. ha(horizontalalignment): 水平对齐方式,参数:[‘center’|‘right’|‘left’]
  5. va(verticalalignment):垂直对齐方式,参数:[‘center’|‘top’|‘bottom’|‘baseline’]
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
#每个时间点的销量绘图
times =['2015/6/26', '2015/8/1','2015/9/6','2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','20162016/5/15', '2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
# 收入
income = np.random.randint(500,2000,size=len(times))
# 支出
expenses = np.random.randint(500,2000,size=len(times))
# 只显示部分时间,或指定某规则展示
ticks=range(1,len(times),2) # 隔一个显示一个
labels = [times[i][2:] for i in ticks] #将内容替换,例如2015/6/26变为15/6/26
plt.xticks(ticks=ticks,labels = labels, rotation=90)
#绘制图形
plt.plot(times, income, label = 'Income')
plt.plot(times, expenses, label = 'Expenses')
# 每个图形的label值将会作为图例说明
plt.legend(loc='best')
# 显示两条线每个点的真实值
for a,b in zip(times,income):
    plt.text(a,b,str(b),ha='center',va='center')
for a,b in zip(times,expenses):
    plt.text(a,b,str(b),ha='center',va='baseline')
plt.show()

在这里插入图片描述

二、元素可视化性

1. 显示网格plt.grid()

  • plt.grid(True,linestyle=“–”,color=“gray”,linewidth=“0.5”,axis = ‘x’)
    • linestyle:线型
    • color:颜色
    • linewidth:宽度
    • axis:x,y,both,显示x/y/两种都有的格网
from matplotlib import pyplot as plt
# 引入numpy包
import numpy as np
# 规定x(横坐标)范围为-3.1415926...到+3.15159....
x = np.linspace(-np.pi,np.pi,256,endpoint=True) # 创建-π到π,分成256份的列表
# 获取每个x的cos和sin值,取值处于0-1之间
c,s = np.cos(x),np.sin(x) # 获取x列表的cos和sin曲线
plt.plot(x,c)
plt.plot(x,s)
# 添加x和y都有的both网格线,灰色,线宽0.5
plt.grid(True,linestyle='--',color='gray',linewidth='0.5',axis='both')

在这里插入图片描述

2. plt.gca()操作坐标轴

gca就是get current axes的缩写,表示获取当前坐标轴
在这里插入图片描述


图中4条用红色标识的黑色框线在Matplotlib中称为spines,我们可以挪动他们


在这里插入图片描述

  • 获取4个轴
ax = plt.gca() # 获取坐标轴对象
ax.spines['right'] # 获取右边的轴对象
ax.spines['top'] # 获取上边的轴对象
ax.spines['left'] # 获取左边的轴对象
ax.spines['bottom'] # 获取底部的轴对象
  • 获取右边和上边的两个轴,并将其设置为不可见。获取左边的轴
    • ax.spines[‘right’].set_visible(False) # 设置为不可见
    • ax.spines[‘top’].set_color(‘none’) # 设置颜色为无
    • ax.spines[‘left’].set_position((‘axes’, 0.5)) # 设置左边轴到整个axes轴的中间0.5位置
      • axes取值0.0-1.0之间,代表整个轴上的位置比例,例如整条直线的20%的位置
      • data表示按值挪动,会将轴放置在对应值的位置,例如0就是放在0位置,适用于需要将轴放置在特定值位置的情况
    • ax.spines[‘bottom’].set_position((‘data’,0.0))# 设置底部轴到0位置
from matplotlib import pyplot as plt
import numpy as np
x= np.arange(-50,50,1)
y = x ** 2
# 获取当前坐标轴
ax = plt.gca()
# 设置右侧和上侧为none
ax.spines['right'].set_visible(False) # 设置为不可见
ax.spines['top'].set_color('none') # 设置颜色为无
# 设置左边轴到整个axes轴的中间0.5位置
ax.spines['left'].set_position(('axes', 0.5))
# 设置底部轴到0位置
ax.spines['bottom'].set_position(('data',0.0))
plt.plot(x,y)

会发现并没有到中间位置是不是?因为我们y的取值范围是-50到50,中间位置不是0,所以这种情况我们会使用data来设置left轴
在这里插入图片描述

# 设置左边轴到值0位置,其余代码没有做改动,就不放过来了
ax.spines['left'].set_position(('data', 0))

在这里插入图片描述

  • 我们可以通过ylim()函数指定y的值域,因为上图中函数都是>=0,所以我们没办法形成10字坐标。因此我们通过ylim()函数设置一些负值,让后将bottom轴放在0位置
from matplotlib import pyplot as plt
import numpy as np
x= np.arange(-50,50,1)
y = x ** 2
# 获取当前坐标轴
ax = plt.gca()
# 设置右侧和上侧为none
ax.spines['right'].set_visible(False) # 设置为不可见
ax.spines['top'].set_color('none') # 设置颜色为无
# 设置左边轴到整个axes轴的中间0.5位置
ax.spines['left'].set_position(('data', 0))
# 设置y的值域为[-2500,2500]
plt.ylim(-2500,2500)
# 设置底部轴到0位置
ax.spines['bottom'].set_position(('data',0.0))
plt.plot(x,y)

在这里插入图片描述

3. plt.rcParams设置画图分辨率,大小等信息

之前我们解决中文显示问题,设置默认字体为黑体时和处理负号时,用过这个属性

  • plt.rcParams[‘figure.figsize’] = (8.0,4.0) #设置figure_size英寸
  • plt.rcParams[‘figure.dpi’] = 300 #设置分辨率
    • 默认像素:[6.0,4.0],分辨率72,对应到图片尺寸为432×288
    • 指定dpi = 100,图片尺寸600×400
    • 指定dpi = 300,图片尺寸1800×1200
  • 一般只指定plt.rcParams[‘figure.dpi’] = 100或200就够用
from matplotlib import pyplot as plt
import numpy as np
x= np.arange(-50,50,1)
y = x ** 2
# 获取当前坐标轴
ax = plt.gca()
# 设置右侧和上侧为none
ax.spines['right'].set_visible(False) # 设置为不可见
ax.spines['top'].set_color('none') # 设置颜色为无
# 设置左边轴到整个axes轴的中间0.5位置
ax.spines['left'].set_position(('data', 0))
# 设置y的值域为[-2500,2500]
plt.ylim(-2500,2500)
# 设置底部轴到0位置
ax.spines['bottom'].set_position(('data',0.0))
plt.rcParams['figure.figsize'] = (10,5)
plt.rcParams['figure.dpi'] = 100
plt.plot(x,y)

在这里插入图片描述

4. 线条样式

plot函数可以根据x和y画一条曲线,并指定color颜色,alpha透明度,linestyle折线样式,linewidth折线宽度,marker标记点,arkeredgecolor标记点边的颜色,markersize标记点大小,markeredgewidth标记点边宽

  • plt.plot(x,y,color=‘red’,alpha=0.3,linestyle=‘-’,linewidth=5,marker=‘o’,markeredgecolor=‘r’,markersize=‘20’,markeredgewidth=10)
    • color:16进制RGB颜色,或者直接用英文或缩写字符,参考地址https://tools.jb51.net/color/jPicker在这里插入图片描述
      • blue:缩写字符’b’,为蓝色
      • green:缩写字符’g’,为绿色
      • red:缩写字符’r’,为红色
      • cyan:缩写字符’c’,为青色
      • magenta:缩写字符’m’,为品红色
      • yellow:缩写字符’y’,为黄色
      • black:缩写字符’k’,为黑色
      • white:缩写字符’w’,为品白色
    • alpha:取值范围[0,1],透明度
    • linestyle:折线样式
      • ‘-’:实线
      • ‘–’:虚线
      • ‘-.’:点划线
      • ‘:’:冒号形式的虚线
    • marker:标记点
      • ‘.’:点标记
      • ‘o’:圆圈标记
      • ‘x’:X标记
      • ‘D’:钻石标记
      • ‘H’:六角标记
      • ‘s’:正方形标记
      • ‘+’:加号标记
x = np.arange(0,100,10)
y = x ** 2
plt.plot(x,y,linewidth='1',label='text',color='r',linestyle='--',marker='H')
plt.legend(loc='upper left')

在这里插入图片描述

x= np.arange(-50,50,1)
y = x ** 2
plt.plot(x,y,linewidth='1',label='text',color='#FFA54F',linestyle='-.',marker='D',markersize=3)
plt.legend(loc='best')

在这里插入图片描述

  • 也有简写形式,线条样式,标记和颜色可以写在一起,因为语法没有重复的.但是可读性差,还是不要用了
plt.rcParams['figure.dpi']=120
x = np.linspace(0,10,100)
plt.plot(x,x+0,'-g',label='-g') # 实线绿色
plt.plot(x,x+1,'--c',label='--c') # 虚线浅蓝色
plt.plot(x,x+2,'D-.r',label='D-.r',markersize=0.1) # 钻石标记,点横虚线,红色

在这里插入图片描述

三、图形对象

Matplotlib中,面向对象核心思想是创建一个图形对象figure object。通过对象调用其方法和属性,有助于更好地处理多个画布

  1. pyplot负责生成图像对象,记为obj
  2. 通过obj来添加一个或多个axes对象(绘图区域)

Matplotlib提供了matplotlib.figure图形类模块,它包含了创建图形对象的方法。通过调用pyplot模块中gigure()函数来实例化figure对象

1. 创建图形对象

  • plt.figure(num = None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True, ∗ ∗ ** kwargs)
    • num:图像编号或名称,数字为编号,字符串就识别为名称
    • figsize:指定figure对象宽和高,单位为英寸
    • dpi:制定绘图对象的分辨率,即每英寸多少像素点,缺省值(默认)为72
    • facecolor:背景颜色
    • edgecolor:边框颜色
    • frameon:是否显示边框
    • ∗ ∗ ** kwargs:可选参数
fig = plt.figure() # 创建一个空figure对象

在这里插入图片描述

x = np.arange(0,50,1)
y = x ** 2
# 创建一个尺寸(6,4),dpi为100,背景色为红色,边框颜色为蓝色的figure对象
fig = plt.figure('f1',figsize=[6,4],dpi=100,facecolor='red',edgecolor='blue')
plt.plot(x,y)

在这里插入图片描述

2. 绘制多子图

figure是绘制对象(可以理解为一个空白画布),一个figure对象可以包含多个Axes子图,一个Axes是一个绘图区域,不加设置时,Axes为1,且每次绘图其实都是在figure上的Axes上绘图。

  • add_axes():添加区域
  • subplot():均等地划分画布,只是创建一个包含子图区域的画布,(返回区域对象)
  • subplots():既创建了一个包含子图区域的画布,又创建了一个figure图形对象(返回图形对象和区域对象)

2.1 add_axes():添加区域

Matplotlib定义了一个axes类(轴域类),该类对象被称为axes对象(即轴域对象),它指定了一个有数值范围限制的绘图区域(我们作画的区域)。在一个给定的画布(figure)中可以包含多个axes对象,但是同一个axes对象只能在一个画布中使用

2D绘图区域(axes)包含两个轴(axis)对象

  • add_axes(rect)
    • 该方法用来生成一个axes轴域对象,对象的位置由参数rect决定
    • rect是位置参数,接受一个由4个元素组成的浮点数列表,形如[left,bottom,width,height],left好bottom表示距离底层画布中矩形区域的左下角的偏差坐标(x,y),如果是0就正好与左下角重合,以及宽度width和高度height(注意宽高都是根据底层figure的百分比设置)
fig = plt.figure(figsize=[4,2],dpi=100,facecolor='red',edgecolor='blue')
# ax1从画布起始位置绘制,宽高和画布一至
ax1 = fig.add_axes([0,0,1,1])
# ax2左下角距离figure左下角(0.2,0.2)的距离,宽高分别是底层figure的50%
ax2 = fig.add_axes([0.2,0.2,0.5,0.5])
# ax1中画一条直线
ax1.plot([1,2,3,4],[2,4,6,8])
# ax2中画一条曲线
x = np.arange(-50,50,1)
y = x ** 2
ax2.plot(x,y)

在这里插入图片描述

2.2 subplot()函数,均等划分画布

  • a x = p l t . s u b p l o t ( n r o w s , n c o l s , i n d e x , ∗ a r g s , ∗ ∗ k w a r g s ) ax = plt.subplot(nrows,ncols,index,*args,**kwargs) ax=plt.subplot(nrows,ncols,index,args,kwargs)
    • nrows:行
    • ncols:列
    • index:索引
    • kwargs:title/xlabel/ylabel等…
  • 返回值:区域对象
  • nrows与ncols表示要划分几行几列的子区域(就是在一张纸上通过画横线和竖线将纸分为几块,而且这些块必定均等),index初始值为1,用来选定具体某个子区域
  • 例如subplot(233)代表分为两行三列,选中index为3的子图进行绘制

但是我们要有面向对象的思想,通过创建figure对象,为其添加子图。

add_subplot(3,2,1)就表示将整个画布分为3行两列后,第一块区域设置为一个子图,其它没有被选中的区域不会生成子图

x = np.arange(-50,50,1)
y = x ** 2
fig = plt.figure(dpi = 100,facecolor='red',edgecolor='blue') # 创建figure画布对象
# 将整个画布分为3行两列后,第一块区域设置为一个子图,画曲线
subP1 = fig.add_subplot(3,2,1)
subP1.grid(True)
subP1.plot(x,y)
# 将整个画布分为1行2列后,第2块区域设置为一个子图,画直线
subP2 = fig.add_subplot(122)
subP2.grid(True)
subP2.plot(x,x)

在这里插入图片描述

  • 也可以再次调用set_相关函数,修改子图属性,例如subP2.set_xlabel(‘x_1111111111’)
# 设置x轴标签为x_1111111111
subP2.set_xlabel('x_1111111111')

如果想要将整个画布就按照几行几列全部分成子图,而不是像上面一样分完后的所有子图中仅仅通过index激活一个,就使用fig.subplots()方法

x = np.arange(-50,50,1)
y = x ** 2
fig = plt.figure(dpi = 100,facecolor='red',edgecolor='blue') # 创建figure画布对象
# 将figure平均分成三行两列
subplots = fig.subplots(3,2)
# 第二行第二个子图设置网格线,并画出曲线
subplot1=subplots[1][1]
subplot1.grid()
subplot1.plot(x,y)
## 第3行第1列画网格线并画出直线
subplot2=subplots[2][0]
subplot2.grid()
subplot2.plot(x,x)

在这里插入图片描述

2.3 tight_layout()紧凑布局

在这里插入图片描述


上图中可以看到,两张子图内容重叠了,我们可以 tight_layout()紧凑布局一下解决这个问题

x = np.arange(-50,50,1)
y = x ** 2
fig = plt.figure(dpi = 100,facecolor='red',edgecolor='blue') # 创建figure画布对象
# 将整个画布分为3行两列后,第一块区域设置为一个子图,画曲线
subP1 = fig.add_subplot(3,2,1)
subP1.grid(True)
subP1.plot(x,y)
# 将整个画布分为1行2列后,第2块区域设置为一个子图,画直线
subP2 = fig.add_subplot(323,projection='3d',facecolor='white',title="3D",xlabel='x_1',ylabel='y_1',zlabel='z_1')
subP2.grid(True)
subP2.plot(x,x)
# 紧凑布局,让子图们挨着,但是不重叠,不会档住另一个子图的字
fig.tight_layout()

在这里插入图片描述

3. 柱状图

一种用矩形柱来表示数据分类的图表,可以垂直绘制,也可以水平绘制,高度与所表示的数值成正比关系。显示了不同类别之间的比较关系,例如水平X轴指定被比较的类别,垂直Y轴表示具体类别的值

  • m a t p l o t l i b . p y p l o t . b a r ( x , h e i g h t , w i d t h : f l o a t = 0.8 , b o t t o m = N o n e , ∗ , a l i g n : s t r = ′ c e n t e r ′ , d a t a = N o n e , ∗ ∗ k w a r g s ) matplotlib.pyplot.bar(x,height,width:float = 0.8, bottom = None, *, align:str = 'center',data = None,**kwargs) matplotlib.pyplot.bar(x,height,width:float=0.8,bottom=None,,align:str=center,data=None,kwargs)
    • x:x坐标,数据类型为float类型,一般为np.arange()生成的固定步长列表
    • heigh:表示柱状图高度,也就是y坐标值,数据类型float,一般为一个列表,包含生成柱状图的所有y值
    • width:柱状图宽度,取值0-1,默认0.8
    • bottom:柱状图起始位置,y轴起始坐标,默认None
    • align:柱状图中心位置,center表示中间,lege表示边缘,默认center
    • color:柱状图颜色,默认蓝色
    • alpha:透明度,取值0-1,默认1
    • label:标签,设置后需要调用plt.legend()生成
    • edgecolor(ec):边框颜色
    • linewidth(lw):边框宽度,浮点数或类数组,默认Nonw\
    • tick_label:柱子刻度标签,取值为字符串或字符串列表,默认值None
    • linestyle(ls):线条样式

3.1 基本柱状图

figure1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue') # 创建画布
figure1_subplot1 = figure1.add_subplot(1,1,1) # 创建子图,覆盖整个画布
# 设置为黑体
plt.rcParams['font.sans-serif']=['SimHei']
# 设置轴中负号编码
plt.rcParams['axes.unicode_minus']=False
x = range(5)
data = [5,20,15,25,10]
# 设置子图标题,网格线
figure1_subplot1.set_title('基本柱状图')
figure1_subplot1.grid(linestyle='--',alpha=0.5)
# 基本柱状图
figure1_subplot1.bar(x = x,height=data)
# 显示每天数据的值
for a,b in zip(x,data):
    figure1_subplot1.text(a,b,b,ha='center',va='baseline')

在这里插入图片描述

  • bottom参数:指定每个柱子从哪开始画,一般用于绘制堆积式柱形图
figure1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue') # 创建画布
figure1_subplot1 = figure1.add_subplot(1,1,1) # 创建子图,覆盖整个画布
# 设置为黑体
plt.rcParams['font.sans-serif']=['SimHei']
# 设置轴中负号编码
plt.rcParams['axes.unicode_minus']=False
x = range(5)
data = [5,20,15,25,10]
# 设置子图标题,网格线
figure1_subplot1.set_title('基本柱状图')
figure1_subplot1.grid(linestyle='--',alpha=0.5)
# 基本柱状图,bottom指定每个柱子(data = [5,20,15,25,10])的起始位置,所以需要和height=data的数量一一对应
figure1_subplot1.bar(x = x,height=data,bottom=[10,20,5,0,10])
# 显示每天数据的值
for a,b in zip(x,data):
    figure1_subplot1.text(a,b,b,ha='center',va='baseline')

在这里插入图片描述

  • color参数设置颜色,可以一次设置多个值
# 只是额外指定了color参数,为每一个柱子都可以设置color,但是如果color的个数更少,会循环设置颜色
# 例如若干个数据,只指定了蓝色,红色,黄色,那么会按照蓝色,红色,黄色,蓝色,红色,黄色,蓝色.....
figure1_subplot1.bar(x = x,height=data,bottom=[10,20,5,0,10],color=['b','r','y'])

在这里插入图片描述

  • 描边
    • edgecolor:指定描边的颜色
    • linewidth:指定描边的线宽
    • linestyle:指定描边的线型(可以参考前面《线条样式》)
figure1_subplot1.bar(x = x,height=data,bottom=[10,20,5,0,10],color=['b','r','y'],edgecolor='red',linewidth=5,linestyle = '--')

在这里插入图片描述

3.2 同位置多柱状图

在这里插入图片描述
在这里插入图片描述

  1. 需要对x轴进行计算(将x轴转数值)
  2. 确定每个柱状图x轴起始位置
  3. 设置图形宽度
  4. 图形2起始位置 = 图形1起始位置+图形宽度

图形1起始位置是系统帮我们定的

  1. 图形3起始位置 = 图形1起始位置+2 ∗ * 图形宽度
  2. 每个柱状图需要循环显示文本内容
  3. 显示图例
figure1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue') # 创建画布
figure1_subplot1 = figure1.add_subplot(1,1,1) # 创建子图,覆盖整个画布
# 设置子图标题,网格线
figure1_subplot1.set_title('同位置多柱状图')
figure1_subplot1.grid(linestyle='--',alpha=0.5)
# 数据准备
countries = ['挪威','德国','中国','美国','瑞典']#国家
gold_medal = [16,12,9,8,8]#金牌
silver_medal = [8,10,4,10,5]#银牌
bronze_medal = [13,5,2,7,5]#铜牌
# 1. x轴转为数值
x = np.arange(len(countries))
# 2. 设置图形宽度
width = 0.25
# 3. 确定起始位置
gold_x = x #x现在都是数值[1,2,3,4,5,....],系统会自动帮我们生成x轴,那么gold_x正好会放在对于值位置
silver_x = x + width # gold_x处于1,2,3,4,5,...位置,那么gold_x+宽度0.25,正好是1.25,2.25,3.25,....位置
bronze_x = x + 2*width
# 根据位置进行绘图
figure1_subplot1.bar(gold_x, gold_medal, width, label='Gold',color='y')
figure1_subplot1.bar(silver_x, silver_medal, width, label='Silver',color='gray')
figure1_subplot1.bar(bronze_x, bronze_medal, width, label='Bronze',color='sienna')
# 显示每条数据的值
for i in range(0,len(countries)):
    figure1_subplot1.text(gold_x[i],gold_medal[i],gold_medal[i],ha='center',va='baseline')
    figure1_subplot1.text(silver_x[i],silver_medal[i],silver_medal[i],ha='center',va='baseline')
    figure1_subplot1.text(bronze_x[i],bronze_medal[i],bronze_medal[i],ha='center',va='baseline')
''' 下面代码和上面等价
def set_text(x,y):
    for a,b in zip(x,y):
        figure1_subplot1.text(a,b,b,ha='center',va='baseline')
set_text(gold_x,gold_medal)
set_text(silver_x,silver_medal)
set_text(bronze_x,bronze_medal)
'''
# x坐标轴标签位置居中,并且设置为国家名
plt.xticks(gold_x+width,countries)

在这里插入图片描述

3.3 堆叠图

figure1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue') # 创建画布
figure1_subplot1 = figure1.add_subplot(1,1,1) # 创建子图,覆盖整个画布
# 设置子图标题,网格线
figure1_subplot1.set_title('同位置多柱状图')
figure1_subplot1.grid(linestyle='--',alpha=0.5)
# 数据准备
countries = ['挪威','德国','中国','美国','瑞典']#国家
gold_medal = np.array([16,12,9,8,8])#金牌
silver_medal = np.array([8,10,4,10,5])#银牌
bronze_medal = np.array([13,5,2,7,5])#铜牌
# 1. x轴转为数值
x = np.arange(len(countries))
# 2. 设置图形宽度
width = 0.25
# 3. 确定起始位置
gold_bottom = 0 # 金牌在最底下
silver_bottom = gold_medal# 银牌堆叠在金牌上面,所以起始值就是金牌的高度
bronze_bottom = silver_bottom+silver_medal # 堆在银牌上面,银牌起始值+银牌高度
# 根据位置进行绘图
figure1_subplot1.bar(x, gold_medal, width, label='Gold',color='y',bottom=gold_bottom)
figure1_subplot1.bar(x, silver_medal, width, label='Silver',color='gray',bottom=silver_bottom)
figure1_subplot1.bar(x, bronze_medal, width, label='Bronze',color='sienna',bottom=bronze_bottom)
# 坐标轴和图例
figure1_subplot1.set_ylabel('奖牌数')
plt.legend(loc='upper right')
# x坐标轴标签位置居中,并且设置为国家名
figure1_subplot1.set_xticks(x,countries)

# 显示每个柱子的值,注意虽然是堆积的,但是每个国家金牌,银牌,铜牌,显示各自值,而不是累加
def set_text(x,y,s): # x是横坐标,y是纵坐标,s是显示的值
    for a,b,c in zip(x,y,s):
        figure1_subplot1.text(a,b,c,ha='center',va='top')
set_text(x,gold_medal,gold_medal)
set_text(x,gold_medal+silver_medal,silver_medal)
set_text(x,gold_medal+silver_medal+bronze_medal,bronze_medal)

在这里插入图片描述

4. 水平柱状图

  • b a r h ( y , w i d t h , h e i g h t , l e f t , ∗ , a l i g n , ∗ ∗ k w a r g s ) barh(y,width,height,left,*,align,**kwargs) barh(y,width,height,left,,align,kwargs)和普通柱状图bar()函数用法一致,只不过和bar是反过来的,要通过y参数传入y轴数据,width代表每条柱子的宽度,而不是高度

依然是金牌的例子,创建一个简单的水平条形图

countries = ['挪威','德国','中国','美国','瑞典']#国家
gold_medal = np.array([16,12,9,8,8])#金牌
# y轴刻度为国家,每个柱子的宽度(也就是每个柱子的长度)为金牌数量,高度也就是每个柱子的粗细为0.3
plt.barh(y=countries,width = gold_medal,height=0.3,label='Gold',color='y')

在这里插入图片描述

  • 注意我们绘制任何东西,都是绘制到指定坐标位置
# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
# 数据
movie = ['新蝙蝠侠','狙击手','奇迹笨小孩']
real_day1 = np.array([4053,2548,1543])
real_day2 = np.array([7840,4013,2421])
real_day3 = np.array([8080,3673,1342])
# 堆积图
fig1_subplot1.barh(y=movie,width=real_day1,height = 0.2,color='blue',left=0,label='day1票房')
fig1_subplot1.barh(y=movie,width=real_day2,height = 0.2,color='red',left=real_day1,label='day2票房')
fig1_subplot1.barh(y=movie,width=real_day3,height = 0.2,color='y',left=real_day1+real_day2,label='day3票房')
# 显示图例
fig1_subplot1.legend(loc='upper right')# 显示图例
# fig1_subplot1.text(real_day1[0],movie[0],real_day1[0],ha='center',va='top')
# 显示值
# text方法依然是将指定内容显示到指定区域
def set_text(x,y,s):
    for a,b,c in zip(x,y,s):
        fig1_subplot1.text(a,b,c,ha='center',va='center',bbox=dict(facecolor='white', alpha=0.5),rotation=90)
# x为每个柱子顶部位置,y为每个电影位置,展示的内容就是票房多少
set_text(real_day1,movie,real_day1)
set_text(real_day2+real_day1,movie,real_day2)
set_text(real_day3+real_day2+real_day1,movie,real_day3)
# 最后额外展示汇总结果
b = ["total:%i"%i for i in (real_day3+real_day2+real_day1)]
set_text(real_day3+real_day2+real_day1+1500,movie,b)

在这里插入图片描述

# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
# 数据
movie = ['新蝙蝠侠','狙击手','奇迹笨小孩']
real_day1 = np.array([4053,2548,1543])
real_day2 = np.array([7840,4013,2421])
real_day3 = np.array([8080,3673,1342])
# y轴数值化
y = np.arange(len(movie))
# 高度
height = 0.2
# 绘制同位置多条形图
fig1_subplot1.barh(y=y-height,width=real_day1,height = height,color='blue',label='day1票房')
fig1_subplot1.barh(y=y,width=real_day2,height = height,color='red',label='day2票房')
fig1_subplot1.barh(y=y+height,width=real_day3,height = height,color='y',label='day3票房')
fig1_subplot1.legend(loc='upper right')
# 改y轴的显示
fig1_subplot1.set_yticks(y,movie)
# 显示值
def set_text(x,y,s):
    for a,b,c in zip(x,y,s):
        fig1_subplot1.text(a,b,c,ha='center',va='center',bbox=dict(facecolor='blue', alpha=0.2),rotation=90)
set_text(real_day1,y-height,real_day1)
set_text(real_day2,y,real_day2)
set_text(real_day3,y+height,real_day3)

在这里插入图片描述

5. 直方图

histogram,又称质量分布图,是条形图的一种,由一系列高度不等的纵向线段来表示数据分布情况。直方图横轴表示数据类型,纵轴表示分布情况

直方图用于概率分布,显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数

在这里插入图片描述

柱状图直方图
一般用于描述离散型分类数据的对比一般用于描述连续数据的分布关系
每根柱子宽度固定,柱子之间会有间距每根柱子宽度可以不一样,且一般没有间距
横轴变量可以任意排序横轴变量有一定顺序规则

5.1 普通直方图

  • p l t . h i s t ( x , b i n s , r a n g e , d e n s i t y , w e i g h t s , c u m u l a t i v e , b o t t o m , h i s t t y p e , a l i g n , o r i e n t a t i o n , r w i d t h , l o g , c o l o r , l a b e l , s t a c k e d , n o r m e d , ∗ , d a t a , ∗ ∗ k w a r g s ) plt.hist(x,bins,range,density,weights,cumulative,bottom,histtype,align,orientation,rwidth,log,color,label,stacked,normed,*,data,**kwargs) plt.hist(x,bins,range,density,weights,cumulative,bottom,histtype,align,orientation,rwidth,log,color,label,stacked,normed,,data,kwargs)

    • x:作为直方图所要用的数据,必须是一维数组;多维数组可以先进行扁平化再作图;是必选参数
    • bins:直方图的柱数,即要分的组数,默认为10
    • weights:与x形状相同的权重数组;将x中每个元素乘以对应权重值再计数;如果normed或density取值为True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图
    • density:布尔类型,可选参数。如果为True,返回元组的第一个元素会将计数标准化以形成一个概率密度,也就是说,直方图下的面积(或积分)总和为1.是通过将计数除以数字的数量来实现的观察,以箱子的宽度而不是除以总数数量的观察。如果叠加也是“真实”的,那么柱状图被规范化为1.(替代normed)
    • bottom:数组,标量值或None;每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子;即直方图上下偏移距离
    • histtype:{‘bar’,‘barstacked’,‘step’,‘stepfilled’};{传统直方图,堆叠条形直方图,未填充的条形直方图(只有外边框),有填充的直方图}。注意当histtype取值为step或stepfilled时,rwidth设置失效(就是无法指定柱子之间的间隔,默认连接在一起)
    • align:{‘left’,‘mid’,‘right’};{柱子中心位于bins左边缘,左右边缘之间,右边缘}
    • color:具体颜色
    • label:标签
    • normed:是否将得到的直方图向量归一化,即显示占比,默认为0,不归一化;不推荐使用,建议改用density参数;
    • edgecolor:直方图边框颜色
    • alpha:透明度
  • 返回值

    • n:返回数组或数组列表,代表直方图的值,就是每个柱子的高度
    • bins:返回数组,各个bin(柱子)的区间范围,就是每个柱子在x轴起始位置和结束位置,因为从第二个柱子开始,每个柱子起始位置是前一个柱子结束位置,所以只会统计一个值,而最后一个柱子的结束位置才会额外统计。因此bins共有n+1个值
    • patches:返回列表的列表,或列表。返回每个bin里面包含的数据,是一个list,这个返回的东西更加齐全,有每个柱子的xy坐标,宽度,高度,角度.都是通过get方法获取的
# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
# 数据
x_value = np.random.randint(140,180,300)
n,bins,patches = fig1_subplot1.hist(x_value,bins=10,edgecolor='white')
fig1_subplot1.set_title("数据统计")
fig1_subplot1.set_xlabel("身高")
fig1_subplot1.set_ylabel("比率")
print(n,bins)
for i in patches:
    print(i)

在这里插入图片描述
在这里插入图片描述

5.2 折线直方图

  • 直方图中,我们可以加一个折线图,辅助我们查看数据变化情况
    • 首先通过pyplot.subplots()创建Axes对象
    • 通过Axes对象调用hist()方法绘制直方图,返回折线图所需的x,y数据
    • Axes对象调用plot()绘制折线图
# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
# 数据
x_value = np.random.randint(140,180,300)
n,bins,patches = fig1_subplot1.hist(x_value,bins=10,edgecolor='white')
fig1_subplot1.set_title("数据统计")
fig1_subplot1.set_xlabel("身高")
fig1_subplot1.set_ylabel("比率")
position = patches[0].get_width()/2
fig1_subplot1.plot(bins[0:len(bins)-1]+position,n)
for i in range(len(bins)-1):
    fig1_subplot1.text(bins[0:len(bins)-1][i]+position,n[i],s = str(n[i])+"个")

在这里插入图片描述

5.3 不等距分组

前面的bins参数我们给的是固定值,代表分组的组数,而如果我们传入列表,就是指定每个柱子的起始位置和结束位置。

# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
# 数据
x_value = np.random.normal(100,20,100)
bins = [50,60,70,90,100,110,140,150] # 人为指定bins而不是用一个固定值
fig1_subplot1.hist(x_value,bins=bins,rwidth=0.8) # rwidth表示间隔
fig1_subplot1.set_title("不等距分组")

在这里插入图片描述

5.4 多类型直方图

我们在使用直方图查看数据的频率时,有时会查看多种类型数据出现的频率

也很简单,只需要传一个多维数组就可以了

# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
n_bins = 10
# 生成3行3列的多维数组
x_multi = [np.random.randn(n) for n in [10000,6000,2000]]
print(x_multi[0])
print(x_multi[1])
print(x_multi[2])
# 传入多维
fig1_subplot1.hist(x_multi,bins=n_bins,histtype='bar',label=list("ABC"))
fig1_subplot1.set_title("多类型直方图")

在这里插入图片描述

5.5 堆叠直方图

在多类型直方图的基础上,添加stacked=True参数即可

# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
n_bins = 10
x_multi = [np.random.randn(n) for n in [10000,6000,2000]]
print(x_multi[0])
print(x_multi[1])
print(x_multi[2])
fig1_subplot1.hist(x_multi,bins=n_bins,histtype='bar',label=list("ABC"),stacked=True,rwidth=0.8)
fig1_subplot1.set_title("堆叠直方图")

在这里插入图片描述

6. 饼状图

用来展示部分与整体的比例关系。可以通过x/sum(x)来计算各个扇形区域占饼图总和百分比

  • p i e ( x , e x p l o d e , l a b e l s , c o l o r s , a u t o p c t ) pie(x,explode,labels,colors,autopct) pie(x,explode,labels,colors,autopct)
    • x:序列数组,数组元素对应扇形区域的数量大小
    • labels:列表字符串序列,每个扇形区域备注一个标签名
    • colors:为每个扇形区域设置颜色,默认按照颜色周期自动设置
    • autopct:格式化字符串“fmt%pct”,使用百分比的格式设置每个扇形区域的标签,并将其放置在扇形区域内
    • pctdistance:设置百分比标签与圆心的距离
    • labeldistance:设置各个扇形标签(图例)与圆心的距离
    • explode:指定饼图某些部分的突出显示,即呈现爆炸式
    • shadow:是否添加饼图的阴影效果
# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
# 每个扇形的标签
labels = ['娱乐','育儿','饮食','房贷','交通','其它']
# 每个标签所占的数量
x = [200,500,1200,7000,200,900]
fig1_subplot1.set_title("8月份家庭支出")
# autopct显示百分比。格式化字符串.2f%表示百分比显示两位小数。而autooct这个参数需要用两个%括起来,因此为%.2f%%
autopct='%.2f%%'
# 饼图分离,通过explode参数,指定每个扇形的分离程度(距离圆心的位置)
explode = (0.03,0.05,0.06,0.04,0.08,0.1)
# 标签距离圆心的距离
labeldistance = 0.5
# 百分比距离圆心的距离
pctdistance = 1.0
# 初始角度
startangle = 45
fig1_subplot1.pie(x,labels=labels,autopct=autopct,explode=explode,labeldistance=labeldistance,pctdistance=pctdistance,startangle=startangle)
fig1_subplot1.legend(loc='center left',bbox_to_anchor=(1,0.5))

在这里插入图片描述

7. 散点图

  1. 又称X-Y图,将所有数据以点的形式展现在直角坐标系上,以显示变量之间的相互影响程度,点的位置有变量的数值决定
  2. 通过观察散点图上数据点的分布情况,可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分数据点就会相对密集并以某种趋势呈现
  3. 数据的相关关系主要分为:正相关(两个变量值同时增长)、负相关(一个变量值增加另一个变量值下降)、不相关、线性相关、指数相关等,表现在散点图上的大致分布如下图所示。(其中离点集群较远的点我们称为离群点或异常点)
    在这里插入图片描述
    在这里插入图片描述
  • s c a t t e r ( x , y , s , c , m a r k e r , c m a p , n o r m , v m i n , v m a x , a l p h a , l i n e w i d t h s , e d g e c o l o r s , p l o t n o n f i n i t e , d a t a , ∗ ∗ k w a r g s ) scatter(x,y,s,c,marker,cmap,norm,vmin,vmax,alpha,linewidths,edgecolors,plotnonfinite,data,**kwargs) scatter(x,y,s,c,marker,cmap,norm,vmin,vmax,alpha,linewidths,edgecolors,plotnonfinite,data,kwargs)
    • x,y:散点坐标
    • s:散点面积
    • c:散点颜色(默认’b’蓝色,取值和绘制直线plot()一致)
    • marker:散点样式(默认’o’实心圆,取值和绘制直线plot()一致)
    • alpha:散点透明度
    • linewidths:散点边缘线宽
    • edgecolors:散点边缘颜色
    • cmap:Colormap颜色条,默认None,标量或一个colormap的名字,只有当c是一个浮点数数组时才使用
# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
# x轴数据
x = np.array([1,2,3,4,5,6,7,8])
# y轴数据
y = np.array([1,4,9,16,7,11,23,18])
# s参数表示每个散点的面积,需要是浮点数
s = (20*np.random.rand(8))**2 # 0-1之间的随机浮点数数组
# 颜色
colors = ['r','g','b','c','m','y','k','r']
# 绘制
fig1_subplot1.scatter(x=x,y=y,s=s,c=colors)

在这里插入图片描述

  • 可以选择不同的颜色条——配合cmap参数
    • 颜色条Colormap,Matplotlib提供很多可用颜色条
    • 就像一个颜色列表,每种颜色都有一个范围0-100的值

一个颜色条的例子“viridis”
在这里插入图片描述

# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplots=fig1.subplots(3,3)
# x轴数据
x = np.random.rand(100)
# y轴数据
y = np.random.rand(100)
# s参数表示每个散点的面积,需要是浮点数
# 颜色
colors = np.random.rand(100)
# 绘制
fig1_subplots[0][0].scatter(x=x,y=y,c=colors,cmap='viridis')
fig1_subplots[0][1].scatter(x=x,y=y,c=colors,cmap='plasma')
fig1_subplots[0][2].scatter(x=x,y=y,c=colors,cmap='inferno')
fig1_subplots[1][0].scatter(x=x,y=y,c=colors,cmap='magma')
fig1_subplots[1][1].scatter(x=x,y=y,c=colors,cmap='cividis')

在这里插入图片描述

cmap主要分四大类


1. Sequential colormaps:连续化色图

  1. 特点:在两种色调之间近似平衡的变化,通常是从低饱和(例如白),到高饱和度(例如明亮的蓝)
  2. 应用:适用于大多数科学数据,可以直观地看出数据从低到高的变化
  3. 以中间值颜色进行命名,例如viridis松石绿,主要有5种[‘viridis’,‘plasma’,‘inferno’,‘magma’,‘cividis’]
    在这里插入图片描述

2. 以色系名称命名,由低饱和度到高饱和度过度,例如YIOrRd = yellow-orange-red。主要有「‘Greys’, ‘Purples’, "Blues’, ‘Greens’, ‘Oranges’, ‘Reds’,"YlOrBr, "YlOrRd’, ‘OrRd’, ‘PuRd’,‘RdPu’, ‘BuPu’,‘GnBu’, ‘PuBu’, "YIGnBu’, ‘PuBuGn’, "BuGn’, "YlGn’,‘binary’, ‘gist _yarg’,‘gist _gray’, ‘gray’, "bone’, ‘pink’,‘spring, ‘summer’, ‘autumn’, ‘winter’, ‘cool’, "Wistia’,"hot’,‘afmhot’,‘gist_heat’, 'copper]
在这里插入图片描述
在这里插入图片描述


3. Diverging colormaps:两端发散的色图

  1. 特点:具有中间值(通常是浅色),并在高值和低值处平滑变化为两种不同的色调
  2. 应用:适用于数据的中间值很大的情况(例如0,因此正值和负值分别表示为颜色图的不同颜色)。
  3. [‘PiYG’, ‘PRGn’, ‘BrBG’, 'PuOr, ‘RdGy’, ‘RdBu’,‘RdYIBu’, ‘RdYlGn’, ‘Spectral’, ‘coolwarm’, ‘bwr’,‘seismic’]
    在这里插入图片描述

4. Qualitative colormaps:离散化色图

  1. 特点:离散的颜色组合
  2. 应用:在深色背景上绘制一系列线条时,可以在定性色图中选择一组离散的颜色,例如:color_list=pit.cm.Set3(np.linspace(0,1,12))
    在这里插入图片描述

其它的一些不常用的Miscellaneous colormaps
在这里插入图片描述

8. 保存图片

  • savefig(fname,dpi,facecolor,edgecolor,orientation,papertype,format,transparent,bbox_inches,pad_inches,frameon,metadata)
    • fname:(字符串或者仿路径或仿文件)如果格式已经设置,这将决定输出的格式并将文件按fanme来保存。如果格式没有设置,在fname有扩展名的情况下推断按此保存,没有扩展名将按照默认格式存储为“png”格式,并将适当的扩展名添加在fname后面
    • dpi:分辨率,每英寸点数
    • facecolor:(颜色或"auto",默认值是auto),图形表面颜色。如果是auto,使用当前图形的表面颜色
    • edgecolor:图形边缘颜色。如果是auto,使用当前图形边缘颜色
    • format(字符串):文件格式,比如png,pdf,svg等,未设置的行为将被记录在fname中
    • transparent:用于将图片背景设置为透明。图形也会是透明,除非通过关键字参数指定了表面颜色和/或边缘颜色
# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplots=fig1.subplots(3,3)
# x轴数据
x = np.random.rand(100)
# y轴数据
y = np.random.rand(100)
# s参数表示每个散点的面积,需要是浮点数
# 颜色
colors = np.random.rand(100)
# 绘制
fig1_subplots[0][0].scatter(x=x,y=y,c=colors,cmap='viridis')
fig1_subplots[0][1].scatter(x=x,y=y,c=colors,cmap='plasma')
fig1_subplots[0][2].scatter(x=x,y=y,c=colors,cmap='inferno')
fig1_subplots[1][0].scatter(x=x,y=y,c=colors,cmap='magma')
fig1_subplots[1][1].scatter(x=x,y=y,c=colors,cmap='cividis')
# 保存语句必须写在plt.show()前面
# 如果路径中包含未创建的文件夹,会报错,需要手动或用os模块创建文件夹
import os
if not os.path.exists("matplotlib_figs/"):
    os.mkdir("matplotlib_figs/")
fig1.savefig('matplotlib_figs/Matplotlib.png')
plt.show()

在这里插入图片描述

8. 箱线图绘制

箱线图Boxplot(又称盒式图)是一种用作显示一组数据分散情况资料的统计图表

  1. 不同于一般折线图、柱状图或饼图等,Boxplot包含一些统计学的均值、分位数、极值等统计量,信息量较大
  2. 不仅能分析不同类别数据平均水平差异,还能揭示数据间离散程度、异常值、分布差异等

在这里插入图片描述


  1. boxplot中,从上四分位数绘制一个盒子,然后用一条垂直触须(形象地称为“盒须”)穿过盒子中间
  2. 上垂线延伸至上边缘(最大值),下垂线延伸至下边缘(最小值)

应用场景

  1. 由于能显示一组数据分散情况,常用于品质管理
  2. 有利于数据清洗,能快速知道数据分布情况
  3. 有助于分析数据的偏向,例如分析公司员工收入水平
  • boxplot(x, notch, sym, vert, whis, positions, widths, patch_artist, bootstrap,usermedians, conf_intervals, meanine, showmeans, showcaps, showbox, showfliers, boxprops, labels, flierprops, medlianprops, meanprops, capprops, whiskerprops, manage_ticks, aulorange=False,zorder, ∗ * ,data=None)

    • x:输入数据。类型为数组或向量序列。必备参数。
    • notch:控制箱体中央是否有V型凹槽。当取值为True时,箱体中央有V型凹槽,凹槽表示中位数的置信区间;取值为False时,箱体为矩形。类型为布尔值,默认值为False。可选参数。
    • vert:箱体的方向,当取值为True时,绘制垂直箱体,当取值为False时,绘制水平箱体。类型为布尔值,默认值为Te。可选参数
    • positions:指定箱体的位置,刻度和极值会自动匹配箱体位置,类型为类数组结构,可选参数。默认值为range(1,N+1),N为箱线图的个数。
    • widths:箱体的宽度。类型为浮点数或类数组结构。默认值为0.5或0.15×极值间的距离。
    • labels:每个数据集的标签,默认值为’None"。类型为序列。可选参数。
    • autorange:类型为布尔值,默认值为False。可选参数。当取值为True且数据分布满足上四分位数(75%)和下四分位数(25%)相等。
    • showmeans:是否显示算术平均值,类型为布尔值,默认值为False。可选参数。
    • meanline:均值显示为线还是点。类型为布尔值,默认值为False,可选参数,当取值为True,且showmeans、shownotches参数均为True时显示为线。
    • capprops:箱须横杠的样式。类型为字典,默认值为None。可选参数。
    • boxprops:箱体的样式。类型为字典,默认值为None。可选参数。
    • whiskerprops:箱须的样式。类型为字典,默认值为None。可选参数。
    • flierprops:离群点的样式。类型为字典,默认值为None。可选参数。
    • medianprops:中位数的样式。类型为字典,默认值为None。可选参数。
    • meanprops:算术平均值的样式。类型为字典,默认值为None。可选参数。

只是将x放进去画,那么会显示数据中的中位数,最小值和最大值

# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
x = np.random.rand(20)
fig1_subplot1.boxplot(x)

在这里插入图片描述

想要显示平均值,可以指定参数showmeans,如果想要平均值用线来显示,额外设置meanline=True

# 创建画布和子图
fig1 = plt.figure(dpi = 100,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
x = np.random.rand(20)
fig1_subplot1.boxplot(x,showmeans=True,meanline=True)

在这里插入图片描述

  1. 设置箱体的样式,需要boxprops参数,通过字典指定
  2. 算术平均值的样式,需要meanprops参数,通过字典指定
  3. 如果指定2维数组作为x参数,那么会取出每一列进行绘制boxplot)
# 创建画布和子图
fig1 = plt.figure(dpi = 120,facecolor='white',edgecolor='blue')
fig1_subplot1=fig1.add_subplot(1,1,1)
# 创建5行5列的数据
x = np.random.randint(10,100,size=(5,5))
# boxprops 箱体样式
boxprops = {'linestyle':'--',"linewidth":1,"color":"red"}
# meanprops 算术平均值样式
meanprops = {'marker':'o',"markerfacecolor":'pink',"markersize":2}

fig1_subplot1.boxplot(x,showmeans=True,meanline=True,label=["A","B","c","D","E"],boxprops=boxprops,meanprops=meanprops)
fig1_subplot1.legend()

在这里插入图片描述

二维数据对列统计有什么用呢?例如成绩单,每行代表各个同学的对应成绩,而每列代表学科成绩。我们想要统计某班级数学的中位数等信息就可以用

姓名数学语文
A99125
B903
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值