Python进阶(四十)-数据可视化の使用matplotlib进行绘图

举报
SHQ5785 发表于 2020/12/30 00:45:08 2020/12/30
【摘要】 #Python进阶(四十)-数据可视化の使用matplotlib进行绘图 ##前言   matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图。实际上,matplotlib的对象体系严谨而有趣,为使用者提供了巨大的发挥空间。用户在熟悉了核心对...

#Python进阶(四十)-数据可视化の使用matplotlib进行绘图
##前言
  matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图。实际上,matplotlib的对象体系严谨而有趣,为使用者提供了巨大的发挥空间。用户在熟悉了核心对象之后,可以轻易的定制图像。matplotlib的对象体系也是计算机图形学的一个优秀范例。即使你不是Python程序员,你也可以从文中了解一些通用的图形绘制原则。
  matplotlib使用numpy进行数组运算,并调用一系列其他的Python库来实现硬件交互。matplotlib的核心是一套由对象构成的绘图API。

![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/99b0752bb189b25bd7fe1b979024208a.png)

  应毕业论文要求,分析互联网购药平台——“立马送药”中用户的购药规律,实现用户购药信息可视化。在学习完Python基础知识之后决定使用python结合matplotlib绘制折线图、柱形图和饼图,分别统计每个平台用户每月的购药量(折线图或柱形图-药品数量趋势)和药品种类(饼图)。现把相关知识整理如下:
##一、环境准备
  首先是需要下载安装相关的工具包,分别输入下面的代码进行安装:

 pip install numpy pip install matplotlib  

  
 
  • 1
  • 2

##二、开始画图
###简单直线图

import numpy as np
import 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")

  
 
  • 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
  • 31
![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/2488ac9b53fd6219253f0fe703bdb1cd.png) ###折线图
#在当前绘图对象绘图(X轴,Y轴,蓝色虚线,线宽度)
plt.plot(x,y,"b--",linewidth=1)  

  
 
  • 1
  • 2

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

#-*- coding: utf-8 -*-
from importlib import reload

import xlrd
from matplotlib import pyplot as plt
from matplotlib.ticker import  MultipleLocator

import numpy as np
import sys
reload(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 = {}

# 得到dict1
def 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() #y
plt.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()

  
 
  • 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
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

###饼状图
  画饼图用到的方法为: 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 ) 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  参数说明:

  • x(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化
  • labels (每一块)饼图外侧显示的说明文字
  • explode (每一块)离开中心距离
  • startangle 起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起 shadow 是否阴影
  • labeldistance label绘制位置,相对于半径的比例
  • shadow 是否阴影
  • labeldistance label绘制位置,相对于半径的比例, 如<1则绘制在饼图内侧
  • autopct 控制饼图内百分比设置,可以使用format字符串或者format
    function’%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 xlrd
from matplotlib import pyplot as plt
from fuzzywuzzy import fuzz
import numpy as np
import sys
#因为在sys加载后,setdefaultencoding方法被删除了,所以要通过重新导入sys来设置系统编码
reload(sys) #将系统默认编码改为utf-8
sys.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 = {} 

# 得到dict1
def 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()

  
 
  • 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
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89

###设置线条形状、颜色等
  本文是学习《matplotlib for python developers》的一点笔记。plot画图时可以设定线条参数。包括:颜色、线型、标记风格。
####1)控制颜色
  颜色之间的对应关系为
  b—blue c—cyan g—green k—-black
  m—magenta r—red w—white y—-yellow
  有三种表示颜色的方式:
  a:用全名 b:16进制如:#FF00FF c:RGB或RGBA元组(1,0,1,1) d:灰度强度如:‘0.7’
####2)控制线型
  符号和线型之间的对应关系
  - 实线
  – 短线
  -. 短点相间线
  : 虚点线
####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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/3da0016b45677a6a46a5ca9cf05e1f7f.png)

##相关参考资料

![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/f9c024e20306fb0e4e3e84a15aab3217.png)

文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/70195698

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。