返回总目录页

matplotlib模块详解

 

简单绘图,折线图,并保存为图片

import matplotlib.pyplot as plt

x=[1,2,3,4,5]

y=[10,5,15,10,20]

plt.plot(x,y,'ro-',color='blue')

plt.savefig('testblueline.jpg')

plt.show()
程序

 生成图片:

import matplotlib.pyplot as plt
x=[1,2,3,4,5] #x轴数据
y=[10,5,15,10,20] #y轴数据。x轴和y轴一一对应就形成平面直角坐标系的坐标
plt.plot(x,y,'ro-',color='blue') #第一个参数是x轴,第二个是y轴,第四个指定折线图颜色。
plt.savefig('testblueline.jpg') #将绘图保存为图片
plt.show() #在pycharm中能展示出来

饼图绘制 

# coding=utf-8
import matplotlib.pyplot as plt

election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214}
candidate = [key for key in election_data]
votes = [value for value in election_data.values()]
plt.figure(figsize=(10, 10), dpi=100)
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'],
        textprops={'fontsize': 24}, labeldistance=1.05)
plt.legend(fontsize=16)
plt.title("2020年A国大选票数占比", fontsize=24)
plt.savefig('bingtu.jpg')
plt.show()
程序
# coding=utf-8
import matplotlib.pyplot as plt

election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214} #数据字段
candidate = [key for key in election_data] #字典的键是候选人,也是饼图的三个扇区
votes = [value for value in election_data.values()] #字典的值是投票人数,
plt.figure(figsize=(10, 10), dpi=100) #
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'],
        textprops={'fontsize': 24}, labeldistance=1.05) #把数值列表也就是投票数放第一个参数,labels是名称也就是候选人列表,
            #autopct参数,写1.2表示饼图数值百分比保留两位小数,如果不加,这里显示出6位小数。如果填1.0或者1,那么没有小数
            #colors参数列表,代表饼图扇区的颜色,与标签即候选人是对应的,第一个颜色列表元素,对应第一个候选人列表元素。字母是颜色开头字母,
            #我将c变成b,扇区就变蓝色,写成r,扇区就变成红色。
            #textprops参数里放标签和数值也就是候选人和投票百分比的文字大小。
            #labeldistance是标签到圆心的距离,1.05正好不压住饼图,小于1,标签(候选人)进入了饼图内,远大于1那么标签离饼图太远。等于1会压盖一点饼图
plt.legend(fontsize=16) #legend 图例,说明的意思。这里可以控制右上角图例的大小。这里候选人就是图例,每个候选人就是图例中的一个,饼图根据它来划分的,然后根据投票数值占比,来划分饼图百分比
plt.title("2020年A国大选票数占比", fontsize=24)#这里控制饼图的标题,标题字体大小
# plt.savefig('bingtu.jpg')
plt.show() #

pie(): matplotlib中绘制饼图的函数。第一个参数传入用于绘制饼图的数据列表,其他参数都是关键字参数。labels参数用于设置每个扇形的标签,说明每个扇形的数据归属。autopct参数用于设置饼图中的百分比,一般保留两位小数,传入"%1.2f%%"即可。colors参数用于设置每个扇形的颜色,与数据列表一一对应,传入一个与数据列表长度相等的列表。textprops参数用于设置标签和百分比的字体、大小等,传入一个字典。labeldistance参数用于设置标签与饼图的距离,默认值为1.1。

饼图将一个圆饼按照各分类的占比划分成多个扇形,整个圆饼代表数据的总量,每个扇形表示该分类占总体的比例大小,所有扇形相加的和等于100%。饼图适用于表示不同分类在总体中的占比情况,通过弧度大小来比较不同分类的占比大小,尤其在需要突出显示其中某一个部分的占比时。

上面的饼图绘制了2020年A国大选的票数占比情况,可以一目了然地看到候选人的得票占比情况。如果需要突出显示某位候选人的得票占比,可以对饼图进行分离展示。

中文字体显示和绘图方框

添加字体变量,其它方法上引用变量 

# coding=utf-8
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties # 步骤一
...
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) # 步骤二
plt.xlabel("x轴", fontproperties=font) # 步骤三
plt.ylabel("y轴", fontproperties=font)
plt.title("标题", fontproperties=font)
plt.show()
程序

创建图形,有x,y轴,有数字标识的正方体形式,此时没有设置字体,不能显示中文,并且终端报警告,没有字体

 x,y轴加字体属性,这样图片中 就显示中文了

修改字体,就报错了,

 虽然simsun.ttc文件在本地也找不到,但是就是能用

 

 

 这个目录下有很多字体,不知道咋用

在方法上直接加参数宋体,黑体。fontproperties

import matplotlib.pyplot as plt
# ...
plt.xlabel("x轴")
plt.ylabel("y轴", fontproperties="SimSun") # 步骤一  (宋体)
plt.title("标题", fontproperties="SimHei") #     (黑体)
plt.show()
程序

 灵活,另一个优点:不污染全局字体设置

 rcParams

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False  # 步骤二(解决坐标轴负数的负号显示问题)
#...
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.title("标题")
plt.show()
程序
 直接给所有的加字体了

 

 简洁的用法。缺点:污染全局字体设置。(所以需要第二步骤)

 一行那里改不存在的字体不可以显示,这里的2行那里有没有,图片貌似都没变化

 

还是字体的

rc的方法

import matplotlib.pyplot as plt
font = {'family' : 'SimHei',
    'weight' : 'bold',
    'size'  : '16'}
plt.rc('font', **font)        # 步骤一(设置字体的更多属性)
plt.rc('axes', unicode_minus=False) # 步骤二(解决坐标轴负数的负号显示问题)
#...
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.title("标题")
plt.show()
程序

 

 灵活的用法。缺点:影响全局字体(所以需要第二步骤)

 

总结

 

方式二用时才设置,且不会污染全局字体设置,更灵活
方式三、方式四不需要对字体路径硬编码,而且一次设置,多次使用,更方便。

 

使用案例

 

import numpy as np
import matplotlib.pyplot as plt
font = {'family' : 'DFKai-SB',
    'weight' : 'bold',
    'size'  : '16'}
plt.rc('font', **font) # pass in the font dict as kwargs
plt.rc('axes',unicode_minus=False)
x = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)
plt.figure(figsize=(8,4))
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.title("标题")
plt.ylim(-1.2,1.2)
plt.legend()
plt.show()
程序

一些中文字体英文名字

 

宋体 SimSun
黑体 SimHei
微软雅黑 Microsoft YaHei
微软正黑体 Microsoft JhengHei
新宋体 NSimSun
新细明体 PMingLiU
细明体 MingLiU
标楷体 DFKai-SB
仿宋 FangSong
楷体 KaiTi
隶书 LiSu
幼圆 YouYuan
华文细黑 STXihei
华文楷体 STKaiti
华文宋体 STSong
华文中宋 STZhongsong
华文仿宋 STFangsong
方正舒体 FZShuTi
方正姚体 FZYaoti
华文彩云 STCaiyun
华文琥珀 STHupo
华文隶书 STLiti
华文行楷 STXingkai
华文新魏 STXinwei

 

 旋转饼图和突出显示

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214}
candidate = [key for key in election_data]
votes = [value for value in election_data.values()]
plt.figure(figsize=(10, 10), dpi=100)
explode = (0.1, 0, 0)
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'], textprops={'fontsize': 24},
        labeldistance=1.05, explode=explode, startangle=90, shadow=True)
plt.legend(loc='upper right', fontsize=16)
plt.title("2020年A国大选票数占比", fontsize=24)
plt.axis('equal')
plt.show()
程序
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #设置字体
election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214} #定义字典数据源
candidate = [key for key in election_data] #定义标签
votes = [value for value in election_data.values()] #定义数值
plt.figure(figsize=(10, 10), dpi=100) #新建画图窗口,窗口长和高。dpi 为设置图形每英寸的点数
explode = (0.1, 0, 0)#设置各部分突出
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'], textprops={'fontsize': 24},
        labeldistance=1.05, explode=explode, startangle=90, shadow=True)
plt.legend(loc='upper right', fontsize=16) #plt.legend()函数主要的作用就是给图加上图例,plt.legend([x,y,z])里面的参数使用的是list的的形式将图表的的名称喂给这和函数
plt.title("2020年A国大选票数占比", fontsize=24)
# plt.axis('equal')
plt.show()
#plt.axis()用法详解:https://www.cnblogs.com/shuaishuaidefeizhu/p/14034415.html
#plt.figure(1)是新建一个名叫 Figure1的画图窗口,
# plt.plot(x,c)是在画图窗口里具体绘制横轴为x 纵轴为c的曲线
#参考设置图形大小和dpi  https://www.cnblogs.com/lijunjie9502/p/10327151.html

 

在绘制饼图的pie()函数中,explode参数用于设置每个扇形到圆心的距离,传入一个与数据列表长度相等的列表,默认每个扇形到圆心的距离都是0,将想要分离展示的扇形距离设置成一个适合的值,如0.1,即可将该部分突出展示。为了展示效果更好,可以使用startangle参数对饼图进行旋转(如将分离的扇形旋转到左侧),给startangle参数传入一个角度,将饼图逆时针旋转对应的角度,startangle参数表示的是饼图的起始角度,默认为正右方向,即传统的x轴正方形,此方向表示0度,设置起始角度后可以实现旋转的效果。对扇形进行分离展示后,将shadow参数设置为True,给饼图添加阴影,使饼图更立体,饼图切分的效果会更好。

在对饼图进行分离后,饼图的布局会发生变化,为了控制饼图占用的区域是一个正方形,且避免饼图变成椭圆形,使用axis('equal')函数,传入'equal'参数。

在上一张饼图的基础上,经过设置后,将获胜者Biden的得票率突出显示,可以更突出地展示获胜者的得票占比。

 绘制环形饼图

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214}
candidate = [key for key in election_data]
votes = [value for value in election_data.values()]
plt.figure(figsize=(10, 10), dpi=100)
explode = (0, 0, 0)
plt.pie(votes, labels=candidate, explode=explode, autopct="%1.2f%%", colors=['c', 'm', 'y'],
        textprops={'fontsize': 24}, labeldistance=1.05, pctdistance=0.85, startangle=90)
plt.pie([1], radius=0.7, colors='w')
plt.legend(loc='upper right', fontsize=16)
plt.title("2020年A国大选票数占比", fontsize=24)
plt.axis('equal')
plt.show()
程序

 

要绘制环形的饼图,在绘制出饼图后,再次调用pie()函数绘制一个更小的纯白饼图即可,先后顺序不能相反。

在绘制纯白的饼图时,传入只有一个数据的列表,一条数据会占满整个饼图,占比100%,颜色设置为colors='w'。radius参数默认为1,如果第一张饼图的radius参数是1,设置白色饼图的radius参数小于1,得到的白色饼图就会小于第一张饼图。此外不需要设置其他参数,白色饼图不需要显示百分比,不需要显示标签等。

绘制完成小的白色饼图,环形效果就实现了,还需要调整第一张饼图的百分比的显示位置。在pie()函数中,pctdistance参数用于设置百分比显示离圆心的距离,默认值是0.6,设置环形效果时,可以将pctdistance参数增大,使百分比显示在环形的中间。同时,因为环形饼图是通过遮挡实现的,阴影展示不完全,看起来比较别扭,所以不设置shadow参数,去掉阴影。

柱形图

 1、基本柱形图

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list)
plt.show()
程序

柱形图

2、设置柱形图颜色

 

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list, fc='r')
plt.show()
程序

加上参数fc改变为单一颜色

 加上颜色参数也可以

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list, color='rgb')
plt.show()
程序

 3、添加横坐标的标签

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday', 'Tuesday', 'Friday', 'Sunday']
num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list, color='rgb', tick_label=name_list)
plt.show()
程序

 

 4、堆叠柱状图

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday', 'Tuesday', 'Friday', 'Sunday']
num_list = [1.5, 0.6, 7.8, 6]
num_list1 = [1, 2, 3, 1]
plt.bar(range(len(num_list)), num_list, label='boy', fc='y')
plt.bar(range(len(num_list)), num_list1, bottom=num_list, label='girl', tick_label=name_list, fc='r')
plt.legend()
plt.show()
程序

适用于如下课程表类似的结构。根据时间或者某个序列,对一种或多类对象的数值,显示每个序列中这几类的数值和占比情况

 

 

 

 5、并列柱形图

 还是适用上图的情况

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday' ,'Tuesday' ,'Friday' ,'Sunday']
num_list = [1.5 ,0.6 ,7.8 ,6]
num_list1 = [1 ,2 ,3 ,1]
x =list(range(len(num_list)))
total_width, n = 0.8, 2
width = total_width / n

plt.bar(x, num_list, width=width, label='boy', fc='y')
for i in range(len(x)):
    x[i] = x[i] + width
plt.bar(x, num_list1, width=width, label='girl', tick_label=name_list, fc='r')
plt.legend()
plt.show()
程序

 

 

 6、条形柱形图

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday', 'Tuesday', 'Friday', 'Sunday']
num_list = [1.5, 0.6, 7.8, 6]
plt.barh(range(len(num_list)), num_list, tick_label=name_list)
plt.show()
程序

 

 

 
 
 
 
 
 
 
中文字体:https://www.jb51.net/article/134546.htm
https://www.cnblogs.com/bainianminguo/p/10952586.html
饼图:https://blog.csdn.net/weixin_43790276/article/details/109684441
cpu图:https://www.it610.com/article/1304777370737086464.htm
动态cpu:http://www.zzvips.com/article/145005.html
展示图片在html页面:https://www.cnblogs.com/amize/p/15060978.html
绘图知识点:https://www.cnblogs.com/zhizhan/p/5615947.html
菜鸟教程:https://www.runoob.com/matplotlib/matplotlib-pie.html
matplotlib柱形图:https://blog.csdn.net/qq_29721419/article/details/71638912
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday', 'Tuesday', 'Friday', 'Sunday']
num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list, color='rgb', tick_label=name_list)
plt.show()
posted @ 2021-12-20 12:50  马昌伟  阅读(1044)  评论(0编辑  收藏  举报
博主链接地址:https://www.cnblogs.com/machangwei-8/