matplotlib的概念和应用


matplotlib

  1. 什么是matplotlib
  2. matplotlib的基本要点
  3. matplotlib的散点图、直方图、柱状图
  4. 更多的画图工具

什么是matplotlib

  • 最流行的Python底层绘图库,主要做数据可视化图表

为什么要学matplotlib

  1. 能将数据进行可视化,更直观的呈现
  2. 使得数据更加客观、更具有说服力

matplotlib的基本要点及利用matplotlib绘制折线图

利用matplotlib绘制折线图

基础框架
  1. 导包 (多处都需要使用,所以给包取一个别名plt): from matplotlib import pyplot as plt

  2. 设置x、y的参数,根据具体情况设置

  3. 绘图:plt.plot(x,y)

  4. 展示图形,调用show()函数:plt.show()

存在的问题:
  1. 图片大小和清晰度不是我们想要的。
  2. 如果我想要获取图片,怎么获取?
  3. x、y轴以及图表的意义不明。
  4. x、y轴的坐标不是我们想要的坐标。
  5. 若存在多个对象,如何将多个对象绘入同一个折线图中?
  6. 折线图的样式我不喜欢,我不想要直线,我想要虚线或其他样式怎么办?颜色、粗细又怎么改变?
  7. 能不能有网格,这样就能更加清晰的看出每一个x对应的y了?
折线图的优化(基本要点):

1.设置图片的大小和清晰度
调用 figure(figsize=(length,width),dpi) 函数,figsize传入的是图片的长和宽,dpi传递的是图片的分辨率

fig = plt.figure(figsize=(20,8),dpi=80)

2.保存图片
调用 savefig() 函数

plt.savefig("./t1.png")
#可以保存为svg这种格式,放大就不会有锯齿了

3.为图表、横坐标、纵坐标设置label
分别调用 title(str)、xlabel(str)、ylabel(str) 函数,如果label中出现了中文,还应当设置字体,例如: fontproperties=my_font

plt.xlabel(“时间”,fontproperties=my_font)
plt.ylabel(“温度 单位°C”,fontproperties=my_font)
plt.title(“10点到12点每分钟的气温变化情况”,fontproperties=my_font)

补充
为什么要设置字体??
matplotlib默认不支持中文字符,因为默认的英文字体无法显示汉字

查看linyx/mac下面支持的字体
fc-list —>查看支持的字体
fc-list :lang=zh ---->查看支持的中文(冒号前面有空格)

如何修改matplotlib的默认字体???

① 通过matplotlib.rc修改(windows/linux)

import matplotlib
#windows和linux设置字体的方式
#①
font = {'family':'MicroSoft Yahei',
        'weight':'bold',
        'size':'larger'}
matplotlib.rc("font",**font)
#②
matplotlib.rc("font",family='MicroSoft Yahei',weight='bold')

②通过matplotlib下的font manager 解决(windows/linux/mac)

from matplotlib import font_manager
#fname是字体的路径
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\STXINGKA.TTF")

4.设置x、y轴的坐标值
调用 xticks()、yticks() 函数

#设置x轴的刻度
plt.xticks(range(2,26))
#设置y轴的刻度
plt.yticks(range(12,28))

补充
x、y轴的坐标值有时不一定是纯数值,有时时固定格式的字符串,此时我们可以调整坐标值

以x轴为例:(此处旋转是由于横坐标的数值过长,挤在一起看不清楚)

x = range(0,120)
#调整x轴的刻度
_xtick_labels = [“10点{}分”.format(i) for i in range(60)]
_xtick_labels += [“11点{}分”.format(i) for i in range(60)]
plt.xticks(list(x)[::3],_xtick_labels[::3],rotation=45,fontproperties=my_font) #rotation旋转的度数

在这里插入图片描述5.多个对象的折线图
设置多个对象,在同一个折线图中表示出来

#设置x和y的坐标
x = range(11,31,1)
y1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [2,5,6,1,2,3,4,1,0,1,0,0,4,2,4,1,1,0,1,0]
plt.plot(x,y1)
plt.plot(x,y2)

此时,不难发现,我们的折线图有了两个对象,但是仅仅根据图,我们不能够明白不同颜色的折线代表谁。那么此时我们可以添加一个提示信息,我们把这个提示信息称为图例。

以两个对象为例:

plt.plot(x,y1,label=“小明”,color=“orange”)
plt.plot(x,y2,label=“小鱼”,color=“blue”)
#添加图例,显示y1、y2对应的含义
plt.legend(prop=my_font,loc=0) #此处d中文用prop表示,也只有此处用它,loc传递的是位置参数,详情看源码

在这里插入图片描述
补充
对折线的

plt.plot(x,y1,label=“小明”,color=“orange”,linestyle=’:’,linewidth=2)

6.改变线条的样式
在调用plot()函数时,我们可以通过对不同参数的设置,改变折线的样式。

color:颜色
linestyle:线条的款式
linewidth:线条的粗细

以上图的小明为例:

plt.plot(x,y1,label=“小明”,color=“orange”,linestyle=’:’,linewidth=2)
在这里插入图片描述

7.添加网格
调用grid()函数

#绘制网格
plt.grid(alpha=0.1)#透明度

折线图的几个实例及代码
  1. 假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别是[15,13,14.5,17,20,25,26,26,27,22,18,15]
import matplotlib
from matplotlib import pyplot as plt

#方式一 设置中文显示
font = {'family':'MicroSoft Yahei',
        'weight':'bold',
        'size':12}
matplotlib.rc("font",**font)

x = range(0,26,2)
y = [12,15,13,14.5,17,20,25,26,26,27,22,18,15]

#设置图片大小
fig = plt.figure(figsize=(20,8),dpi=80) 

# 绘图
plt.plot(x,y)

#设置x轴的刻度
plt.xticks(range(0,24))
#设置y轴的刻度
plt.yticks(range(12,28))

#设置图表、x、y轴的标签
plt.title("一天中温度随时间的变化")
plt.xlabel("时间 时")
plt.ylabel("温度 °C")

#保存
# plt.savefig("./t1.png") #可以保存为svg这种格式,放大就不会有锯齿了

# 展示图形
plt.show()

在这里插入图片描述
2. 绘制10:00到12:00的气温折线图,温度使用随机数

from matplotlib import pyplot as plt
import random
import matplotlib

#方式一 设置中文显示
matplotlib.rc("font",family='MicroSoft Yahei',weight='bold')

x = range(0,120)
y = [random.randint(20,35) for i in range(120)]

#设置图片大小
plt.figure(figsize=(20,8),dpi=80)
#绘制图片
plt.plot(x,y)

#调整x轴的刻度
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
#取步长,数字与字符串一一对应,数据的长度一样
plt.xticks(list(x)[::3],_xtick_labels[::3],rotation=45) #rotation旋转的度数

#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度 单位°C")
plt.title("10点到12点每分钟的气温变化情况")

#展示图片
plt.show()

在这里插入图片描述3. 假设大家在30岁的时候,根据自己的实际情况,统计出来了从11岁到30岁每年交的女(男)朋友的数量如列表a,请绘制出该数据的折线图,以便分析自己每年交女(男)朋友的数量走势
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [2,5,6,1,2,3,4,1,0,1,0,0,4,2,4,1,1,0,1,0]
要求:
y轴表示个数
x轴表示岁数,比如11岁,12岁等

from matplotlib import font_manager
from matplotlib import pyplot as plt

# 方式二 设置字体
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\STXINGKA.TTF")

# 设置图片大小
fig = plt.figure(figsize=(18, 6), dpi=90)

# 设置x和y的坐标
x = range(11, 31, 1)
y1 = [1, 0, 1, 1, 2, 4, 3, 2, 3, 4, 4, 5, 6, 5, 4, 3, 3, 1, 1, 1]
y2 = [2, 5, 6, 1, 2, 3, 4, 1, 0, 1, 0, 0, 4, 2, 4, 1, 1, 0, 1, 0]

# 绘图,有两个成员,所以给每个成员设置一个标签,和线条颜色,线条样式(看源码)和粗细
plt.plot(x, y1, label="小明", color="orange", linestyle=':', linewidth=2)
plt.plot(x, y2, label="小鱼", color="blue")

# 设置横坐标、纵坐标
x_tick = ["{}岁".format(i) for i in range(11, 31)]
plt.xticks(list(x)[::1], x_tick[::1], fontproperties=my_font)
plt.yticks(range(0, 7), range(0, 7))  # 可以不用设置

# 设置标题、横坐标纵坐标的意思
plt.xlabel("年龄", fontproperties=my_font)
plt.ylabel("数量", fontproperties=my_font)
plt.title("11到30岁交的女朋友数量", fontproperties=my_font)

# 绘制网格
plt.grid(alpha=0.1)

# 添加图例,显示y1、y2对应的含义
plt.legend(prop=my_font, loc=0)  # 此处d中文用prop表示,也只有此处用它,loc传递的是位置参数,详情看源码

# 显示图片
plt.show()

在这里插入图片描述

利用matplotlib绘制散点图

基础框架
  1. 导包 (多处都需要使用,所以给包取一个别名plt): from matplotlib import pyplot as plt

  2. 设置x、y的参数,根据具体情况设置

  3. 绘图:plt.scatter(x,y)

  4. 展示图形,调用show()函数:plt.show()

案例及代码

假设要绘制一个散点图,表示某地3月份和10月份每天的温度变换
a =[11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
要求:
y轴表示温度
x轴表示时间,比如3月1日、3月2日等

from matplotlib import pyplot as plt
from matplotlib import font_manager

#x、y的坐标设置
y_3 =[11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
x_3 = range(1,32)
x_10 = range(51,82)

# 方式二 设置字体
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\STXINGKA.TTF")


#设置图形大小
plt.figure(figsize=(30,5),dpi=80)

#绘图
plt.scatter(x_3,y_3,label="3月份")
plt.scatter(x_10,y_10,label="10月份")

#调整x轴的刻度
_x = list(x_3) + list(x_10)
_xtick_labels = ["3月{}日".format(i) for i in x_3]
_xtick_labels += ["10月{}日".format(i-50) for i in x_10]
plt.xticks(_x[::1],_xtick_labels[::1],fontproperties=my_font,rotation=45)

#调整y轴的刻度
plt.yticks(range(0,31)[::2],range(0,31)[::2])

#添加描述信息
plt.title("3月份和10月份每天的温度变化",fontproperties=my_font)
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度 ℃",fontproperties=my_font)

#展示
plt.show()

在这里插入图片描述

利用matplotlib绘制柱状图

基础框架
  1. 导包 (多处都需要使用,所以给包取一个别名plt): from matplotlib import pyplot as plt

  2. 设置x、y的参数,根据具体情况设置

  3. 绘图:
    纵向条形图
    plt.bar(x,y,width) #width是柱状图的宽度

    横向条形图
    plt.barh(x,y,height) #height是柱状图的宽度

  4. 展示图形,调用show()函数:plt.show()

❤️注意:当出现多个对象时,对象的每个共同数值所在坐标需要略微调整,不然条形会重叠.具体看后面的案例及代码

案例及代码

①假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?
a=[“战狼2”,“速度与激情8”,“功夫瑜伽”,“西游伏妖篇”,“变形金刚5:最后的骑士”,“摔跤吧!爸爸”,“加勒比海盗5:死无对证”,“金刚:骷髅岛”,“极限特工︰终极回归”,“生化危机6:终章”,“乘风破浪”,“神偷奶爸3”,“智取威虎山”“大闯天竺”,“金刚狼3∶殊死一战”,“蜘蛛侠:英雄归来”,“悟空传”,“银河护卫队2”,“情圣”,“新木乃伊”]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]单位:亿

from matplotlib import pyplot as plt
from matplotlib import font_manager

#设置字体
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\STXINGKA.TTF")

a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇"
    ,"变形金刚5:\n最后的骑士","摔跤吧!爸爸","加勒比海盗5:\n死无对证",
   "金刚:骷髅岛","极限特工︰\n终极回归","生化危机6:\n终章","乘风破浪",
   "神偷奶爸3","智取威虎山","大闯天竺","金刚狼3∶\n殊死一战",
   "蜘蛛侠:\n英雄归来","悟空传","银河护卫队2","情圣","新木乃伊"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,
     10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

#设置大小
plt.figure(figsize=(20,10),dpi=80)
#绘制图形
plt.bar(range(len(a)),b,width=0.3)
#设置字符串到x轴
plt.xticks(range(len(a)),a,fontproperties=my_font,rotation=90)
#设置y轴纵坐标
plt.yticks(range(0,60+1,5))
#添加描述信息
plt.title("xxxx年电影top20及票房数据",fontproperties=my_font)
plt.xlabel("电影名称",fontproperties=my_font)
plt.ylabel("票房数据 亿",fontproperties=my_font)
#添加网格
plt.grid(alpha=0.3)

plt.show()

在这里插入图片描述优化

from matplotlib import pyplot as plt
from matplotlib import font_manager

#设置字体
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\STXINGKA.TTF")

a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇"
    ,"变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证",
   "金刚:骷髅岛","极限特工︰终极回归","生化危机6:终章","乘风破浪",
   "神偷奶爸3","智取威虎山","大闯天竺","金刚狼3∶殊死一战",
   "蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,
     10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

#设置大小
plt.figure(figsize=(10,20),dpi=80)
#绘制图形
plt.barh(range(len(a)),b,height=0.5)

plt.yticks(range(len(a)),a,fontproperties=my_font)

plt.xticks(range(0,60-2,3))
#添加描述信息
plt.title("xxxx年电影top20及票房数据",fontproperties=my_font)
plt.ylabel("电影名称",fontproperties=my_font)
plt.xlabel("票房数据 亿",fontproperties=my_font)
#添加网格
plt.grid(alpha=0.3)

plt.show()

在这里插入图片描述②假设你知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15),2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?
a=[“猩球崛起3:终极之战”,“敦刻尔克”,“蜘蛛侠:英雄归来”,“战狼2”]
b_16=[15746,312,4497,319]
b_15=[12357,156,2045,168]
b_14 = [2358,399,2358,362]

from matplotlib import pyplot as plt
import matplotlib

# 方式一 设置中文显示
matplotlib.rc("font", family='MicroSoft Yahei', weight='bold')

a=["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_16=[15746,312,4497,319]
b_15=[12357,156,2045,168]
b_14 = [2358,399,2358,362]

bar_width = 0.2

x_14 = list(range(len(a)))
x_15 = [i+bar_width for i in x_14]
x_16 = [i+bar_width*2 for i in x_14]

#设置大小
plt.figure(figsize=(15,20),dpi=80)

#绘图
plt.bar(range(len(a)),b_14,width=bar_width,label="9月14日")
plt.bar(x_15,b_15,width=bar_width,label="9月15日")
plt.bar(x_16,b_16,width=bar_width,label="9月16日")

#设置横纵坐标
plt.xticks(x_15,a)
plt.yticks(range(0,16001,500))

#设置标签
plt.title("电影分别在2017-09-14(b_14), 2017-09-15(b_15),2017-09-16(b_16)三天的票房情况")
plt.xlabel("电影名称")
plt.ylabel("票房数 万")

#添加图例
plt.legend()

plt.show()

在这里插入图片描述

from matplotlib import pyplot as plt
import matplotlib

# 方式一 设置中文显示
matplotlib.rc("font", family='MicroSoft Yahei', weight='bold')

a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
y = ["2017-09-14","2017-09-15","2017-09-16"]
y_1 = list(range(len(y)))
y_2 = [i+0.1 for i in y_1]
y_3 = [i+0.1*2 for i in y_1]
y_4 = [i+0.1*3 for i in y_1]
y_0 = [i+0.1*1.5 for i in y_1]
movie1 = [2358,12357,15746]
movie2 = [399,156,312]
movie3 = [2358,2045,4497]
movie4 = [362,168,319]


#设置大小
plt.figure(figsize=(20,6),dpi=80)

#绘图
plt.barh(y_1,movie1,label="猩球崛起3:终极之战",height=0.1,color="orange")
plt.barh(y_2,movie2,label="敦刻尔克",height=0.1,color="blue")
plt.barh(y_3,movie3,label="蜘蛛侠:英雄归来",height=0.1,color="pink")
plt.barh(y_4,movie4,label="战狼2",height=0.1,color="green")

#设置纵坐标
plt.yticks(y_0,y)
plt.xticks(range(0,16000+1,500))

#添加描述信息
plt.title("2017年4部电影14号、15号、16号的售票情况")
plt.ylabel("时间")
plt.xlabel("票房数据 万张")

#添加图例
plt.legend()

#添加网格
plt.grid(alpha=0.1)

#展示
plt.show()

在这里插入图片描述

利用matplotlib绘制直方图

基础框架
  1. 导包 (多处都需要使用,所以给包取一个别名plt): from matplotlib import pyplot as plt

  2. 设置x、y的参数,根据具体情况设置

  3. 绘图:
    plt.hist(a,bins=(组数),density=True) #density为True表示频率,否则是频数,可根据需求修改

  4. 展示图形,调用show()函数:plt.show()

案例及代码

假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据?
a=[131,98,125,131,124,139,131,107, 128,108,135,138,131,102,107,114,119,128,121,
142,127,130, 124,101,110,116, 117, 110,128,128,115,99,136,126,134,95, 138,
117, 111,78,132,124,113,150, 110,117,86,95,144,105,126,130,126,130, 126,116,
123,106,112,138,123,86,101,99,136,123, 117, 119, 105,137, 123,128,125, 104,
109, 134,125,127,105,120, 107, 129, 116,108,132,103,136,118,102,120,114,105,
115,132, 145,119,121,112,139,125,138,109,132,134,156,106,117, 127,144,139,139,
119, 140,83, 110,102,123,107,143,115, 136,118,139, 123, 112,118, 125, 109,119,
133,112,114, 122,109,106, 123,116, 131,127,115,118, 112,135,115, 146, 137,116,
103,144,83,123, 111, 110,111,100,154,136,100, 118,119,133,134,106,129,126,110,
110,109,141,120,117,106,149,122,122,110,118,127, 121,114,125, 126,114, 140, 103,
130,141, 117, 106, 114, 121, 114, 133,137,92,121,112,146,97,137,105,98,117, 112,
81,97,139,113,134,106,144,110,137, 137, 111, 104,117, 100, 111, 101,110,105,129,
137, 112, 120, 113,133,112,83,94,146,133,101,131, 116,111,84,137,115, 122,106,144,
109,123,116,111,111,133,150]

from matplotlib import pyplot as plt
import matplotlib

# 方式一 设置中文显示
matplotlib.rc("font", family='MicroSoft Yahei', weight='bold')
a=[131,98,125,131,124,139,131,107, 128,108,135,138,131,102,107,114,119,128,121,
   142,127,130, 124,101,110,116, 117, 110,128,128,115,99,136,126,134,95, 138,
   117, 111,78,132,124,113,150, 110,117,86,95,144,105,126,130,126,130, 126,116,
   123,106,112,138,123,86,101,99,136,123, 117, 119, 105,137, 123,128,125, 104,
   109, 134,125,127,105,120, 107, 129, 116,108,132,103,136,118,102,120,114,105,
   115,132, 145,119,121,112,139,125,138,109,132,134,156,106,117, 127,144,139,139,
   119, 140,83, 110,102,123,107,143,115, 136,118,139, 123, 112,118, 125, 109,119,
   133,112,114, 122,109,106, 123,116, 131,127,115,118, 112,135,115, 146, 137,116,
   103,144,83,123, 111, 110,111,100,154,136,100, 118,119,133,134,106,129,126,110,
   110,109,141,120,117,106,149,122,122,110,118,127, 121,114,125, 126,114, 140, 103,
   130,141, 117, 106, 114, 121, 114, 133,137,92,121,112,146,97,137,105,98,117, 112,
   81,97,139,113,134,106,144,110,137, 137, 111, 104,117, 100, 111, 101,110,105,129,
   137, 112, 120, 113,133,112,83,94,146,133,101,131, 116,111,84,137,115, 122,106,144,
   109,123,116,111,111,133,150]

#设置大小
plt.figure(figsize=(20,12),dpi=80)

#计算组数
d = 3 #组距
num_bins = (max(a)-min(a))//d

#绘图
plt.hist(a,num_bins,density=True)   #density为True表示频率,否则是频数,可根据需求修改

#设置x轴的刻度
plt.xticks(range(min(a),max(a)+d,d))

#设置y轴的刻度
rate0 = range(0,300,20)
rate = [i*0.0001 for i in rate0]
plt.yticks(rate)

#添加标签
plt.title("电影时长的分布状态")
plt.xlabel("时间 minite")
plt.ylabel("频率")

#网格
plt.grid()

plt.show()

在这里插入图片描述

对比常用统计图

在这里插入图片描述
学习matplotlib绘图,不仅仅要学习如何绘图,还要学习面对不同的场景、不同的需求,我们应当选择哪种图表,哪种图表能够更直接的反映我们的需求

更多的画图工具

*plotly:可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib和pandas

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值