matplolib学习笔记

折线图和散点图

均在jupyter notebook上进行演示

图片展示用plt.show()

图片保存用plt.savefig(“path”)

要保存图片完毕后才可以用show 不然保存的图片为空白

随机数据作图

#折线图
x = [1,2,3]
y = [1,2,3]
#没有子图的绘图
plt.title('line')  # 添加标题
plt.xlabel('x')  # 添加x轴名称‘x’
plt.ylabel('y')  # 添加y轴名称‘y’

plt.plot(x,y)  # 绘制折线图
plt.scatter(x,y)  # 绘制散点图
plt.text(2.5,2,'y = x')  # 在图中x=2.5,y=2处添加‘y=x’
plt.style.use('_mpl-gallery') #设置绘图风格:_mpl-gallery
plt.show()

#有子图的绘图
p = plt.figure(figsize=(4,6),dpi=80) # 创建画布。大小为4×6,像素为80
#添加子图
ax1 = p.add_subplot(2,1,1) # 分为2×1图形阵,选择第1张图片绘图
plt.title('折线图') # 添加标题
plt.rcParams['lines.linestyle'] = '--' # 修改线条类型
plt.rcParams['lines.linewidth'] = 3 # 修改线条宽度
plt.rcParams['axes.edgecolor'] = 'r'  # 轴颜色设置为红色
plt.rcParams['axes.spines.top'] = False  # 去除顶部轴
plt.rcParams['axes.spines.right'] = False  # 去除右侧轴
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
plt.plot(x,y)
ax2 = p.add_subplot(2,1,2)  # 分为2×1图形阵,选择第2张图片绘图
plt.title("散点图")
plt.scatter(x,y)  # 绘制散点图
plt.show()

读取数据作图

#读取数据
data = np.load(r'./data/国民经济核算季度数据.npz',allow_pickle=True)
# print(len(data['values']))六十九个数据
# print(data.files)  #['columns', 'values']
print(data['columns'])   # 提取columns数组,视为数据的标签
values = data['values']  # 提取values数组,数据的存在位置
values

运行结果为

作散点图

plt.figure(figsize=(12,8),dpi=80)
plt.title('2000-2017年三大产业个季度国民生产总值')
plt.xlabel('时间')
plt.ylabel('生产总值(亿元)')
plt.scatter(values[:,0],values[:,2],marker='D',c = 'r',alpha = 0.5) # 国内生产总值散点为红色
plt.scatter(values[:,0],values[:,3],c='y') # 第一产业增加值散点为黄色
plt.scatter(values[:,0],values[:,4],c='g') # 第二产业增加值散点为绿色
plt.scatter(values[:,0],values[:,5]) # 第三产业增加值散点颜色默认值 此处为蓝色
plt.xticks(values[::4,0],values[::4,1],rotation = 90)  #添加x轴坐标,并旋转45/90度
plt.legend(['第一产业','第二产业','第三产业'])  # 添加图例
plt.show()

有子图绘制

p = plt.figure(figsize=(12,6))
ax1 = p.add_subplot(1,2,1)

plt.title('2000-2017年度三大产业国民生产总值')
plt.xlabel('时间')
plt.ylabel('生产总值(亿元)')
plt.rcParams['lines.linestyle'] = '-' # 修改线条类型
plt.plot(values[:,0],values[:,3])
plt.plot(values[:,0],values[:,4])
plt.plot(values[:,0],values[:,5])
plt.xticks(values[::4,0],values[::4,1],rotation = 90) # x轴的标识点是否rotation旋转
plt.legend(['第一产业','第二产业','第三产业'])
ax2 = p.add_subplot(1,2,2)
plt.title('2000-2017年三大产业个季度国民生产总值')
plt.xlabel('时间')
plt.ylabel('生产总值(亿元)')
plt.scatter(values[:,0],values[:,2],marker='D',c = 'r',alpha = 0.5)
# marker = 'D' 散点为方形  c = 'r' 散点为红色 alpha = 0.5 透明度为0.5
plt.scatter(values[:,0],values[:,3],c='y')
plt.scatter(values[:,0],values[:,4])
plt.scatter(values[:,0],values[:,5])
plt.xticks(values[::4,0],values[::4,1],rotation = 45)
plt.legend(['第一产业','第二产业','第三产业'])
plt.show()

直方图

#直方图
x = np.random.normal(0,1,10000)  # 生成10000个服从标准正态分布数据
plt.title('标准正太分布直方图')
plt.hist(x)
plt.show()

#直方图
plt.figure(figsize=(6,4))
x = np.random.normal(0,1,10000)  # 生成10000个服从标准正态分布数据
plt.title('标准正太分布直方图')
# plt.hist(x)
n, bins, patches = plt.hist(x)
for i in range(len(n)):
    plt.text(bins[i], n[i]*1, int(n[i]), fontsize=12, horizontalalignment="center",va="bottom") #打标签,在合适的位置标注每个直方图上面样本数)

柱状图(条形图)

#条形图
plt.figure(figsize=(6,4))
x = values[-1,3:6]
plt.bar(range(3),x,width = 0.5)
plt.title('2017年第一季度三大产业生产总值')
plt.xlabel('类别')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(3),['第一产业','第二产业','第三产业'])
for i in range(3):
    plt.text(i,x[i],x[i],ha = 'center',va = 'bottom')# 打标签,在合适的位置标注每个直方图上面样本数
plt.show()

饼图

#饼图
plt.figure(figsize=(5,5))
x = values[-1,3:6]
plt.title('2017年第一季度三大产业生产总值分布情况')
plt.pie(x,labels=['第一产业','第二产业','第三产业'],autopct='%0.2f%%',explode = [0.1,0,0],labeldistance=1.2)
plt.show()

箱线图

#箱线图
plt.figure(figsize=(5,5))
x = values[:,3:6]
plt.title('三大产业分布情况')
plt.xlabel('类别')
plt.ylabel('分布')
plt.boxplot(x,labels=['第一产业','第二产业','第三产业'])
plt.show()

一个示例:分析人口数据

读取数据

# 读取数据
import numpy as np
import matplotlib.pyplot as plt
data = np.load(r'./data/populations.npz',allow_pickle = True)
# print(data.files)  #['data', 'feature_names']
values = data['data']
# print(data['feature_names'])
# ['时间' '年末总人口(万人)' '男性人口(万人)' '女性人口(万人)' '城镇人口(万人)' '乡村人口(万人)']
data['data']

绘制散点图和折线图

plt.plot()函数

plt.plot(x, y, format_string, **kwargs)
参数说明
xX轴数据,列表或数组,可选
yY轴数据,列表或数组
format_string控制曲线的格式字符串,可选
**kwargs第二组或更多(x,y,format_string),可画多条曲线

format_string 由颜色字符、风格字符、标记字符组成

color : 控制颜色, color=‘green’
linestyle : 线条风格, linestyle=‘dashed’
marker : 标记风格, marker=‘o’
markerfacecolor: 标记颜色, markerfacecolor=‘blue’
markersize: 标记尺寸, markersize=2

颜色字符

  • ‘b’ 蓝色 ‘m’ 洋红色 magenta
  • ‘g’ 绿色 ‘y’ 黄色
  • ‘r’ 红色 ‘k’ 黑色
  • ‘w’ 白色 ‘c’ 青绿色 cyan
  • ‘#008000’ RGB某颜色 ‘0.8’ 灰度值字符串
  • 多条曲线不指定颜色时,会自动选择不同颜色

风格字符

  • ‘‐’ 实线
  • ‘‐‐’ 破折线
  • ‘‐.’ 点划线
  • ‘:’ 虚线
  • ‘’ ’ ’ 无线条

标记字符

  • ‘.’ 点标记
  • ‘,’ 像素标记(极小点)
  • ‘o’ 实心圈标记
  • ‘v’ 倒三角标记
  • ‘^’ 上三角标记
  • ‘>’ 右三角标记
  • ‘<’ 左三角标记…等等

plt.scatter()函数用于生成一个散点图

matplotlib.pyplot.scatter(x, 
	y, 
	s=20, 
	c='b', 
	marker='o', 
	cmap=None, 
	norm=None, 
	vmin=None, 
	vmax=None, 
	alpha=None, 
	linewidths=None, 
	verts=None, 
	hold=None, 
	**kwargs)

参数:

  • x,y:表示的是shape大小为(n,)的数组,也就是我们即将绘制散点图的数据点,输入数据。

  • s:表示的是大小,是一个标量或者是一个shape大小为(n,)的数组,可选,默认20。

  • c:表示的是色彩或颜色序列,可选,默认蓝色’b’。但是c不应该是一个单一的RGB数字,也不应该是一个RGBA的序列,因为不便区分。c可以是一个RGB或RGBA二维行数组。

  • marker:MarkerStyle,表示的是标记的样式,可选,默认’o’。

  • cmap:Colormap,标量或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用。如果没有申明就是image.cmap,可选,默认None。

  • norm:Normalize,数据亮度在0-1之间,也是只有c是一个浮点数的数组的时候才使用。如果没有申明,就是默认None。

  • vmin,vmax:标量,当norm存在的时候忽略。用来进行亮度数据的归一化,可选,默认None。

  • alpha:标量,0-1之间,可选,默认None。

  • linewidths:也就是标记点的长度,默认None。

p = plt.figure(figsize=(12,10))
#子图1
ax1 = p.add_subplot(2,2,1)
plt.title('人口总数散点图')
plt.scatter(values[0:20,0],values[:20,1])
plt.xticks(rotation = 45)
#子图2
ax2 = p.add_subplot(2,2,2)
plt.title('各类别人口数散点图')
plt.scatter(values[:20,0],values[:20,2],c='y')
plt.scatter(values[:20,0],values[:20,3],c='r')
plt.scatter(values[:20,0],values[:20,4],c='g')
plt.scatter(values[:20,0],values[:20,5])
plt.legend(["男性人口","女性人口","城镇人口","农村人口"],loc='lower left')
plt.xticks(rotation = 45)
#子图3
ax3 = p.add_subplot(2,2,3)
plt.title('人口总数折线图')
plt.plot(values[0:20,0],values[:20,1])
plt.xticks(rotation = 45)
#子图4
ax4 = p.add_subplot(2,2,4)
plt.title('各类别人口数折线图')
plt.plot(values[:20,0],values[:20,2])
plt.plot(values[:20,0],values[:20,3])
plt.plot(values[:20,0],values[:20,4])
plt.plot(values[:20,0],values[:20,5])
plt.legend(["男性人口","女性人口","城镇人口","农村人口"],loc='best')
# loc 图例位置 upper right lower left
plt.xticks(rotation = 45)
plt.show()

绘制直方图

plt. bar添加数据标签
plt.bar_label()函数,为条形图添加数据标签
函数参数

  • container

    container :添加数据标签的条形图名称

  • labels

    labels:数据标签列表

  • fmt

    fimt:数据标签的格式,默认:%g

  • label_type

    label_type:数据标签所处的位置,取值为‘center’或’edge’

    center:数据标签位于条形图的条形中间

    edge:数据标签位于条形图的顶端

    默认值:edge

  • padding

    padding:数据标签与条形图中的每个条形的水平距离

    默认值:0

# 直方图
p = plt.figure(figsize=(12,10))
ax1 = p.add_subplot(2,2,1)
plt.title('1996年男女人口分布')
p1 = plt.bar(range(2),values[-3,2:4],width=0.4)
plt.xticks(range(2),['男','女'])
plt.bar_label(p1,labels=values[-3,2:4],padding=5,fontsize = 20)
#padding:数据标签与条形图中的每个条形的水平距离 默认为0

ax2 = p.add_subplot(2,2,2)
plt.title('2015年男女人口分布')
plt.bar(range(2),values[0,2:4],width=0.3)
plt.xticks(range(2),['男','女'])

ax3 = p.add_subplot(2,2,3)
plt.title('1996年城乡人口分布')
plt.bar(range(2),values[-3,4:],width=0.3)
plt.xticks(range(2),['城','乡'])

ax4 = p.add_subplot(2,2,4)
plt.title('1996年城乡人口分布')
plt.bar(range(2),values[0,4:],width=0.3)
plt.xticks(range(2),['城','乡'])
plt.show()

绘制饼图

import matplotlib.pyplot as plt
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,
 startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, 
 rotatelabels=False, *, normalize=None, data=None)

常用参数:

  1. x即每个扇形的占比的序列或数组
  2. explode如果不是None,则是一个len(x)长度的数组,指定每一块的突出程度;突出显示,设置每一块分割出来的间隙大小
  3. labels为每个扇形提供标签的字符串序列
  4. colors为每个扇形提供颜色的字符串序列
  5. autopct如果它是一个格式字符串,标签将是fmt % pct。如果它是一个函数,它将被调用。
  6. shadow阴影
  7. startangle从x轴逆时针旋转,饼的旋转角度
  8. pctdistance, default: 0.6每个饼片的中心与由autopct生成的文本的开头之间距离与半径的比率,大于1的话会显示在圆外
  9. labeldistance, default: 1.1饼状图标签绘制时的径向距离(我认为这个也与8类似是个比率)。如果设置为None,则不绘制标签,而是存储在图例()中使用。
#饼图
p = plt.figure(figsize=(8,8))
ax1 = p.add_subplot(2,2,1)
plt.title('1996年男女人口占比')
plt.pie(values[-3,2:4],labels=['男','女'],autopct='%0.2f%%')

ax2 = p.add_subplot(2,2,2)
plt.title('2015年男女人口占比')
plt.pie(values[0,2:4],labels=['男','女'],autopct='%0.2f%%')

ax3 = p.add_subplot(2,2,3)
plt.title('1996城乡人口占比')
plt.pie(values[-3,4:],labels= ['城','乡'],autopct='%0.2f%%')

ax4 = p.add_subplot(2,2,4)
plt.title('2015城乡人口占比')
plt.pie(values[0,4:],labels= ['城','乡'],autopct='%0.2f%%')
plt.show()

绘制箱线图

参数详解

plt.boxplot(x,                      # x:指定要绘制箱图的数据
            notch=None,           # notch:是否是凹口的形式展现箱线图,默认非凹口
            sym=None,              # sym:指定异常点的形状,默认为+号显示
            vert=None,              # vert:是否需要将箱线图垂直摆放,默认垂直摆放
            whis=None,             # whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差
            positions=None,   # positions:指定箱线图的位置,默认为[0,1,2…]
            widths=None,         # widths:指定箱线图的宽度,默认为0.5
            patch_artist=None,        # patch_artist:是否填充箱体的颜色
            meanline=None,             # meanline:是否用线的形式表示均值,默认用点来表示
            showmeans=None,       # showmeans:是否显示均值,默认不显示
            showcaps=None,           # showcaps:是否显示箱线图顶端和末端的两条线,默认显示
            showbox=None,             # showbox:是否显示箱线图的箱体,默认显示
            showfliers=None,          # showfliers:是否显示异常值,默认显示
            boxprops=None,           # boxprops:设置箱体的属性,如边框色,填充色等
            labels=None,                  # labels:为箱线图添加标签,类似于图例的作用
            flierprops=None,          # filerprops:设置异常值的属性,如异常点的形状、大小、填充色等
            medianprops=None,   # medianprops:设置中位数的属性,如线的类型、粗细等
            meanprops=None,       # meanprops:设置均值的属性,如点的大小、颜色等
            capprops=None,           # capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等
            whiskerprops=None)   # whiskerprops:设置须的属性,如颜色、粗细、线的类型等

#箱线图
plt.figure(figsize=(6,6))
plt.boxplot(values[0:20,1:],labels=['总体','男','女','城','乡'])
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值