CSDN 编辑时,图片容易缺失,可关注「懒编程」获得更好的阅读体验。
数据可视化是让我们感知数据的一种重要手段,通过不同的数据可视化的方式,使得我们可以在不同维度去理解当前的数据。
数据可视化的基本原理就是,人脑对色块的敏感性远大于数字,从演化论角度来讲,可以很好的分辨出不同颜色事物的祖先更容易活下来,而数字,那个时候并没有,所以进化而来的大脑并不擅长处理数字,进而对干巴巴的数据不敏感。
本章内容会提供代码以及相应的数据,公众号回复:Data1 则可获得。
Matplotlib是Python中用于绘制二维图形的知名第三方库(如果要绘制三维图形,需要额外安装一些支持包),也是很多几天高层次数据可视化第三方库的基础支持库。
Matplotlib中绘制的图有下面集中元素:
解释一下:
上图就是Matplotlib绘制的整个窗口,图中包含了实际图表、x轴、y轴以及每个轴对应的标题、刻度和标签。在Matplotlib中可以为图形添加多个轴域,具体而言,就是使用pyplot来创建多个轴域并改变其形状。
这里可能会疑惑,Figure、Axes与Axis之间有什么关系?特别是Axes与Axis,英文直译都称为轴,可以通过一张图解释三者的关系。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRdW6uqx-1582165587094)(https://raw.githubusercontent.com/ayuLiao/images/master/20190823141059.png)]
大多数时候,使用 Matplotlib 绘制数据的流程是类似的,虽然有些特殊的图像绘制需要一下特殊的操作,但大体流程都相似
接着,就来看一些具体图像的绘制
直方图是我们比较常见的简单图像,它有助于我们理解数据的范围以及加强我们对数据的整体感知。
这里以商店销售特定游戏数据为例来绘制直方图,先来看一下数据的样子
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
np_data=pd.read_csv('datasets/national_parks.csv')
print(np_data.head()) # 打印前5行数据
前5行数据如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1SI6Wwi-1582165587095)(https://raw.githubusercontent.com/ayuLiao/images/master/20190823175227.png)]
绘制直方图的代码如下:
n, bins, patches = plt.hist(np_data['GrandCanyon'], # 某一类游戏的数据
facecolor='orange', # 直方图中矩形的颜色
edgecolor='blue', # 直方图中矩形边的颜色
bins=10 # 绘制多少个矩形
)
plt.show()
print('n: ', n) # 表示每个矩形在 y 轴的最大值
print('bins: ', bins) # 表示每个矩形在 x 轴的值
print('patches: ', patches) # 每个矩形对应的 patch 对象
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynr5y2aD-1582165587103)(https://raw.githubusercontent.com/ayuLiao/images/master/20190823175442.png)]
其中打印的内容如下:
n: [ 5. 9. 10. 2. 1. 9. 16. 2. 1. 2.]
bins: [1253000. 1753123.8 2253247.6 2753371.4 3253495.2 3753619. 4253742.8
4753866.6 5253990.4 5754114.2 6254238. ]
patches:
绘制直方图时,可以将cumulative设置为true,此时绘制直方图时,会将每个矩形前的所有矩形的y轴值累加并加上当前矩形的y轴值,然后再绘制这个矩形,代码与效果如下:
plt.hist(np_data['GrandCanyon'],
facecolor='orange',
edgecolor='blue',
bins=10,
cumulative=True) # 累加属性设置为True
plt.show()
此外可以通过range属性来定义你想要看的直方图范围,比如我只关心(2000000, 5000000)之间的数据,其他数据我不关心,就可以用上range,使用如下:
plt.hist(np_data['GrandCanyon'],
facecolor='orange',
edgecolor='blue',
bins=10,
range=(2000000, 5000000))
plt.show()
效果如下,主要观察图中的x轴,x轴不会超出(2000000, 5000000)这个范围
饼图也是一种常见的图像,它可以帮助我们理解数据中某个部分占总体数据的比例,此外,饼图并不适合用于说明一下信息,首先依旧是读入用于绘制饼图的数据
t_mov= pd.read_csv('datasets/types_movies.csv')
print(t_mov)
数据如下:
绘制饼图的代码如下:
plt.pie(t_mov['Percentage'], # 计算比例的具体数据
labels=t_mov['Sector']) # 对应的标签
plt.axis('equal')
plt.show()
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rtQb24Pc-1582165587112)(https://raw.githubusercontent.com/ayuLiao/images/master/20190823190932.png)]
如果想要定制饼图的颜色,直接通过colors参数,指定一组颜色则可,如下:
colors = ['darkorange', 'sandybrown', 'darksalmon', 'orangered','chocolate']
plt.pie(t_mov['Percentage'],
labels=t_mov['Sector'],
colors=colors,
autopct='%.2f')
plt.axis('equal')
plt.show()
效果如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAgRflCn-1582165587113)(https://raw.githubusercontent.com/ayuLiao/images/master/20190823201402.png)]
此外饼图还能绘制成类似披萨的形态,即即让一些扇形不拼接在一起,指定explode参数则可,如下:
explode = (0, 0.1, 0, 0, 0)
plt.pie(t_mov['Percentage'],
labels=t_mov['Sector'],
colors=colors,
autopct='%.2f',
explode=explode)
plt.axis('equal')
plt.show()
效果如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LH3pBpWM-1582165587114)(https://raw.githubusercontent.com/ayuLiao/images/master/20190823201523.png)]
一些具有时间顺序属性的数据可以被称为时间序列数据,股票数据就是一种典型的时间序列数据,通过这些数据绘制一条时间序列线图可以帮助我们更好的了解数据随着时间的推移有什么变化,下面以部分美股的股票数据为例绘制一下时间序列线图。
简单看一下数据
stock_data = pd.read_csv('datasets/stocks.csv')
# 将其中的日期转为Pandas中的DataTime,会更方便处理
stock_data['Date'] = pd.to_datetime(stock_data['Date'])
stock_data.head()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2CFfWFrF-1582165587115)(https://raw.githubusercontent.com/ayuLiao/images/master/20190823202035.png)]
接着来绘制一下时间序列线图,代码如下:
fig = plt.figure(figsize=(10,6)) # 定义画布大小
# 多个轴域进行作图
ax1 = fig.add_axes([0, 0, 1, 1]) # 添加轴域
ax2 = fig.add_axes([0.05, 0.65, 0.5, 0.3]) # 添加轴域
# 设置标题
ax1.set_title('AAPL vs IBM(inset)')
# 第一个轴域进行绘图
ax1.plot(stock_data['Date'],
stock_data['AAPL'],
color='green')
# 第二个轴域进行绘图
ax2.plot(stock_data['Date'],
stock_data['IBM'],
color='blue')
plt.show()
上述代码中,为了比对两支不同的股票在相同时间段内的走势,这里调用了 add_axes([x0, y0, width, height]) 方法,其前两个参数用于定义轴域左上角的开始位置,而width与height用于定义轴域的大小,定义好了轴域后就可以在其上绘图了,效果如下:
通过与上面类似的方法,可以添加多个轴域绘制多个时间序列线图,如下:
# Figsize for width and height of plot
fig = plt.figure(figsize=(15,7))
fig.suptitle('Stock price comparison 2007-2017',
fontsize=20)
ax1 = fig.add_subplot(231)
ax1.set_title('MSFT')
ax1.plot(stock_data['Date'],
stock_data['MSFT'],
color='green')
ax2 = fig.add_subplot(232)
ax2.set_title('GOOG')
ax2.plot(stock_data['Date'],
stock_data['GOOG'],
color='purple')
ax3 = fig.add_subplot(233)
ax3.set_title('SBUX')
ax3.plot(stock_data['Date'],
stock_data['SBUX'],
color='magenta')
ax4 = fig.add_subplot(234)
ax4.set_title('ADBE')
ax4.plot(stock_data['Date'],
stock_data['ADBE'],
color='orange')
ax4 = fig.add_subplot(235)
ax4.set_title('NFLX')
ax4.plot(stock_data['Date'],
stock_data['NFLX'],
color='chocolate')
ax4 = fig.add_subplot(236)
ax4.set_title('ORCL')
ax4.plot(stock_data['Date'],
stock_data['ORCL'],
color='teal')
plt.show()
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IrHxSg1f-1582165587116)(https://raw.githubusercontent.com/ayuLiao/images/master/20190823203228.png)]
本篇文章介绍了一部分Matplotlib可视化数据的用法,在下一文章中会介绍Matplotlib绘制其他图的用法,记得关注HackPython,拜拜。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RExrCQvT-1582165587117)(https://raw.githubusercontent.com/ayuLiao/images/master/20190821150724.png)]