写点什么

Python 进阶 (四十) 应用 matplotlib 绘图实战

  • 2022-11-16
    江苏
  • 本文字数:4101 字

    阅读完需:约 13 分钟

Python进阶(四十)应用matplotlib绘图实战

一、前言

matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。我将在这篇文章中介绍 matplotlib API 的核心对象,并介绍如何使用这些对象来实现绘图。实际上,matplotlib 的对象体系严谨而有趣,为使用者提供了巨大的发挥空间。用户在熟悉了核心对象之后,可以轻易的定制图像。matplotlib 的对象体系也是计算机图形学的一个优秀范例。即使你不是 Python 程序员,你也可以从文中了解一些通用的图形绘制原则。


matplotlib使用numpy进行数组运算,并调用一系列其他的 Python 库来实现硬件交互。matplotlib 的核心是一套由对象构成的绘图 API。



应毕业论文要求,分析互联网购药平台——“立马送药”中用户的购药规律,实现用户购药信息可视化。在学习完 Python 基础知识之后决定使用 python 结合 matplotlib 绘制折线图、柱形图和饼图,分别统计每个平台用户每月的购药量(折线图或柱形图-药品数量趋势)和药品种类(饼图)。现把相关知识整理如下:

二、环境准备

首先是需要下载安装相关的工具包,分别输入下面的代码进行安装:


    pip install numpy      pip install matplotlib  
复制代码

三、绘图实战

3.1 简单直线图

import numpy as npimport matplotlib.pyplot as plt
#设置x轴范围x=[0,1]#设置y轴范围y=[0,1]#创建绘图对象plt.figure()#创建绘图对象,figsize参数可以指定绘图对象的宽度和高度,单位为英寸,一英寸=80px#plt.figure(figsize=(8,4))#在当前绘图对象进行绘图,两个参数是x、y轴的数据plt.plot(x,y)#在当前绘图对象中画图(x轴,y轴,给所绘制的曲线的名字,画线颜色,画线宽度)#plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)#设置x轴标签plt.xlabel("time(s)")#设置y轴标签plt.ylabel("value(m)")#设置标题plt.title("A simple plot")#图表的标题plt.title("PyPlot First Example")#Y轴的范围plt.ylim(-1.2,1.2)#显示图示plt.legend()#显示图plt.show()#保存图像plt.savefig("easyplot.png")
复制代码


3.2 折线图

#在当前绘图对象绘图(X轴,Y轴,蓝色虚线,线宽度)plt.plot(x,y,"b--",linewidth=1)  
复制代码


简单实现了一个给定数值的折线图的绘制,暂未实现 python 读取 Excel 数值的部分,因此代码比较繁琐。


#-*- coding: utf-8 -*-from importlib import reload
import xlrdfrom matplotlib import pyplot as pltfrom matplotlib.ticker import MultipleLocator
import numpy as npimport sysreload(sys)# sys.setdefaultencoding('utf-8')
plt.rcParams['font.sans-serif'] = ['SimHei']
data0 = xlrd.open_workbook('F:/11data.xlsx')table0 = data0.sheets()[0]
source = []# 每日日期 x值source.extend(table0.col_values(0))# 来源(无重复)set1 = set(source)# 存储来源及来源对应的数目dict1 = {}
# 得到dict1def getDict(): for item in set1: dict1.update({item: source.count(item)})
return dict1
group_labels = ['1日','2日','3日','4日','5日','6日','7日','8日','9日','10日','11日','12日','13日','14日','15日','16日','17日','18日','19日','20日','21日','22日','23日','24日','25日','26日','27日','28日','29日','30日']#x=[u"1日",u"2日",u"3日",u"4日",u"5日",u"6日",u"7日",u"8日",u"9日",u"10日",u"11日",u"12日",u"13日",u"14日",u"15日",u"16日",u"17日",u"18日",u"19日",u"20日",u"21日",u"22日",u"23日",u"24日",u"25日",u"26日",u"27日",u"28日",u"29日",u"30日"]getDict()x=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]y=[26,23,24,24,6,11,34,32,33,28,56,28,16,36,51,44,35,40,2,32,56,63,70,76,60,11,11,58,65,55]labels = dict1.keys()sizes = dict1.values() #yplt.figure()plt.plot(x,y,'-r')plt.plot(x,y,'ro')yminorLocator = MultipleLocator(5)plt.xlabel("日期")plt.ylabel("新闻数(条)")plt.title("2016年11月新闻数")#将y轴主刻度标签设置为0.5的倍数ymajorLocator = MultipleLocator(10)plt.xticks(x, group_labels, rotation=45)# plt.xlim(0, max(x))# plt.savefig(s)plt.show()plt.legend()plt.show()
复制代码

3.3 饼状图

画饼图用到的方法为: matplotlib.pyplot.pie() 参数为:


pie(x, explode=None, labels=None,      colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'),      autopct=None, pctdistance=0.6, shadow=False,      labeldistance=1.1, startangle=None, radius=None,      counterclock=True, wedgeprops=None, textprops=None,      center = (0, 0), frame = False ) 
复制代码


参数说明:


  • x(每一块)的比例,如果 sum(x) > 1 会使用 sum(x)归一化

  • labels (每一块)饼图外侧显示的说明文字

  • explode (每一块)离开中心距离

  • startangle 起始绘制角度,默认图是从 x 轴正方向逆时针画起,如设定=90 则从 y 轴正方向画起 shadow 是否阴影

  • labeldistance label 绘制位置,相对于半径的比例

  • shadow 是否阴影

  • labeldistance label 绘制位置,相对于半径的比例, 如<1 则绘制在饼图内侧

  • autopct 控制饼图内百分比设置,可以使用 format 字符串或者 formatfunction'%1.1f'指小数点前后位数(没有用空格补齐)

  • pctdistance 类似于 labeldistance,指定 autopct 的位置刻度

  • radius 控制饼图半径


返回值:如果没有设置 autopct,返回(patches, texts)如果设置 autopct,返回(patches, texts, autotexts)patches -- list --matplotlib.patches.Wedge 对象 texts autotexts -- matplotlib.text.Text 对象完整代码:


# coding=utf-8__author__ = 'leilu'
#2016年11月关于控烟的新闻的爬虫结果,新闻的主要媒体来源以饼图形式表现
import xlrdfrom matplotlib import pyplot as pltfrom fuzzywuzzy import fuzzimport numpy as npimport sys#因为在sys加载后,setdefaultencoding方法被删除了,所以要通过重新导入sys来设置系统编码reload(sys) #将系统默认编码改为utf-8sys.setdefaultencoding('utf-8') #用来正常显示中文标签plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示负号plt.rcParams['axes.unicode_minus']=False #有中文出现的情况,需要u'内容'#读Excel工作簿data0 = xlrd.open_workbook('F:/11.xlsx') #读工作表 table0 = data0.sheets()[0] source = []# 所有新闻的来源source.extend(table0.col_values(2)) # 来源(无重复)set1 = set(source) # 存储来源及来源对应的数目dict1 = {}
# 得到dict1def getDict(): for item in set1: dict1.update({item: source.count(item)}) #生成输出文档 f = open("result.txt", 'wb')
#把头两个字相同的新闻来源归为一种 for i in dict1.keys(): a = dict1.keys() if i in a: a.remove(i) else: continue # print dict1[i] for j in a: # print dict1[j] if i.upper()[:2] == j.upper()[:2]: if len(i) > len(j) and i in dict1.keys() and j in dict1.keys(): f.write(i + '->' + j + ' ') print str(dict1[i]) + '->' + str(dict1[j]) dict1[j] += dict1[i] dict1.pop(i) elif i in dict1.keys() and j in dict1.keys(): f.write(j + '->' + i + ' ') print str(dict1[i]) + '<-' + str(dict1[j]) dict1[i] += dict1[j] dict1.pop(j)
f.close()
dict1['其他'] = 0
for i in dict1.keys(): #条目数小于5,则该来源归为其他 if dict1[i] < 5: dict1['其他'] += dict1[i] dict1.pop(i)
return dict1
getDict()
# 画饼图labels = dict1.keys()sizes = dict1.values()
patches, l_text, p_text = plt.pie(sizes, labels=labels,labeldistance=1.2, autopct='%3.1f%%',shadow=False,startangle=90, pctdistance=1.08)
for t in l_text: t.set_size = (30)for t in p_text: t.set_size = (20)# 设置x,y轴刻度一致,这样饼图才能是圆的plt.axis('equal')plt.legend()plt.show()
复制代码

3.4 设置线条形状、颜色等

本文是学习《matplotlib for python developers》的一点笔记。plot 画图时可以设定线条参数。包括:颜色、线型、标记风格。

3.4.1 控制颜色

颜色之间的对应关系为 b—blue c—cyan g—green k—-blackm—magenta r—red w—white y—-yellow


有三种表示颜色的方式:a:用全名 b:16 进制如:#FF00FF c:RGB 或 RGBA 元组(1,0,1,1) d:灰度强度如:‘0.7’

3.4.2 控制线型

符号和线型之间的对应关系- 实线&– 短线-. 短点相间线 虚点线

3.4.3 控制标记风格

标记风格有多种:


  • . Point marker

  • , Pixel marker

  • o Circle marker

  • v Triangle down marker

  • ^ Triangle up marker

  • < Triangle left marker

  • Triangle right marker

  • 1 Tripod down marker

  • 2 Tripod up marker

  • 3 Tripod left marker

  • 4 Tripod right marker

  • s Square marker

  • p Pentagon marker

  • Star marker

  • h Hexagon marker

  • H Rotated hexagon D Diamond marker

  • d Thin diamond marker

  • | Vertical line (vlinesymbol) marker

  • _ Horizontal line (hline symbol) marker

  • Plus marker

  • x Cross (x) marker


下面的实例集合以上三种:具体代码和效果如下所示:


import matplotlib.pyplot as plt   import numpy as np   y = np.arange(1, 3, 0.3)   plt.plot(y, ’cx–’, y+1, ‘mo:’, y+2, ‘kp-.’);  plt.show()  
import matplotlib.pyplot as plt import numpy as np y = np.arange(1, 3, 0.3) plt.plot(y, 'cx--', y+1, 'mo:', y+2, 'kp-.');plt.show()
复制代码


四、拓展阅读

发布于: 刚刚阅读数: 5
用户头像

No Silver Bullet 2021-07-09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
Python进阶(四十)应用matplotlib绘图实战_Python_No Silver Bullet_InfoQ写作社区