一、数据可视化
- 数据可视化是关于图形或表格的数据展示。旨在借助于图形化手段,清晰有效地传达和沟通信息。有研究表明,人类大脑接收或理解图片的速度要比文字快6万倍,所以再整齐的数据,再好的表格,也不抵一张图来的简单、快捷。
在数据分析中,数据可视化是一个很重要的部分。数据可视化不仅是展示数据分析的结果,而且更重要的是利用数据可视化来进行数据分析,如发现数据样本中的异常值,观察数据的分布,寻找数据之间的相关性等。
在Python中数据可视化工具,应用性较好的数据可视化工具有Matplotlip、Seaborn、pyecharts=Python + Echarts,Echarts一个纯 Javascript 的图表库等。其中,Matplotlip是用于创建出版质量图表的绘图工具库,Seaborn是在Matplotlib基础上进行了更高级的API封装,从而使得作图更加容易。
二、matplotlib 绘图流程
三、创建绘图对象—figure对象
- 在绘图前,先要创建绘图对象。如果不创建而直接调用绘图plot函数, Matplotlib会自动创建一个绘图对象。
导入绘图的函数库,即pyplot子库。其代码:
import matplotlib.pyplot as plt
创建一个空白画布,可以指定画布大小,像素。其代码:
plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
参数说明:
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 1000)
#随机产生【0,10】之间1000个等差数列的x的值。
y = 3*x +1
plt.figure(figsize=(8,4),facecolor=('Pink'),edgecolor='blue')
plt.plot(x,y,color="red",linewidth=3,linestyle='--')
plt.show()
四、绘制sin(x)和cos(x)的图(plot)
- matplotlib.pyplot中的plot()函数绘制折线图.
plot()函数的常用格式:
plot(x轴,y轴,折线形状颜色标记,标签显示在图例)
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 4*np.pi)
y = np.sin(x)
z = np.cos(x)
plt.plot(x,y,color="red",linestyle='-',linewidth=3)
plt.plot(x,z,color="blue",linestyle='--',linewidth=3)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 4*np.pi)
y = np.sin(x)
z = np.cos(x)
plt.figure(figsize=(10,4))
plt.subplot(121)
plt.plot(x,y,color="red",linestyle='-',linewidth=3)
plt.subplot(122)
plt.plot(x,z,color="blue",linestyle='--',linewidth=3)
plt.show()
五、创建子图
在Matplotlib中,可以将一个绘图对象分为几个绘图区域,在每个绘图区域中可以绘制不同的图像,这种绘图形式称为创建子图。
创建子图:使用subplot()函数,该函数的语法格式:
plt.subplot(numRows,numCols,plotNum)
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-10,10)
b1=np.sin(x)
c1=np.cos(x)
d1=2*x+4
e1=x**2+2*x+1
plt.figure(figsize=(8,4))
#创建绘图对象
plt.subplot(2,2,1)
# 等价于 plt.subplot(221)
plt.title('sin函数')
plt.plot(a1,b1)
plt.subplot(2,2,2)
plt.title('cos函数')
plt.plot(a1,c1)
plt.subplot(223)
plt.title('直线')
plt.plot(a1,d1)
plt.subplot(224)
plt.title('二次函数')
plt.plot(a1, e1)
plt.tight_layout(3,3,3)
plt.show()
六、matplotlib参数配置
在绘制图形时,有许多需要配置的属性,如颜色、字体、线型等。Matplotlib将缺省配置保存在“matplotlibrc”配置文件中,通过修改配置文件,可修改图表的缺省样式,这称之为rc配置或者rc参数。
在Matplotlib中可以使用多个“matplotlibrc”配置文件,它们的搜索顺序:
1. 当前路径 2. 用户配置路径 3. 系统配置路径
(1)修改rcParams变量值:在利用Matplotlib绘图时,有时候在图中进行标注会涉及到一些符号,尤其是中文,负号等可能无法正常显示。
plt.rcParams['font.family']=['SimHei']
#显示图中的中文
plt.rcParams['axes.unicode_minus']=False
#显示图中的负号
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
x=np.linspace(-10,10)
b1=np.sin(x)
c1=np.cos(x)
d1=2*x+4
e1=x**2+2*x+1
plt.figure(figsize=(8,4)) #创建画布
plt.suptitle('不同函数图',fontsize=14) #显示所有子图的总标题
plt.subplot(2,2,1) # plt.subplot(221)
plt.title('sin函数')
plt.plot(a1,b1)
plt.subplot(2,2,2)
plt.title('cos函数')
plt.plot(a1,c1)
plt.subplot(223)
plt.title('直线')
plt.plot(a1,d1)
plt.subplot(224)
plt.title('二次函数')
plt.plot(a1, e1)
plt.tight_layout(3,3,3)
plt.show()
(2)使用rc函数修改参数配置:
使用rc函数可以修改“matplotlibrc”配置文件中的参数,rc函数的语法:
matplotlib.rc(group,**kwargs)
修改了配置文件中,可以调用rcdefaults(),恢复到默认的配置。 matplotlib.rcdefaults()
若要重新载入最新的配置文件,可以调用update()。matplotlib.rcParams.update(matplotlib.rc_params())
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("lines", marker="H",markersize=17,markerfacecolor='b',linewidth=3,linestyle='-.')
font = {'family' : 'monospace',
'style' : 'italic',
'size' : '16'}
matplotlib.rc("font", **font)
plt.title("rc() Example")
plt.plot([1,2,3],[3,4,5],color='r')
plt.show()
七、matplotlib绘制图----添加标题、设置刻度与范围
matplotlib.pyplot添加图标题,坐标轴名称,设置刻度与范围,没有先后顺序。
八、折线图
- 折线图比较适合描述和比较多组数据随时间变化的趋势。或者一组数据对另外一组数据的依赖程度。或者查看因变量y随着自变量x改变的趋势。
使用方法:
matplotlib.pyplot中的plot()函数。
plt.plot(x,y,format_string,**kwargs)
相关参数可以设置:
折线图上图上端点的位置,标记符号的形状,大小和颜色以及线条的颜色,线型等样式。
九、折线图实例
如附件1所示:
分析1996~2015年人口变化情况。
文件populations.csv中包含了1996~2015的人口的统计数据,查看各个特征(年末总人口、男性人口,女性人口、城镇人口和乡村人口)随时间(年份)推移发生的变化情况。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = 'SimHei'
## 设置中文显示
matplotlib.rcParams['axes.unicode_minus'] = False
#按列读入数据
a0 = np.loadtxt('populations.csv',delimiter=',',dtype=np.str,
usecols=(0,),skiprows=1,unpack=False)
a1,a2,a3,a4,a5=np.loadtxt('populations.csv',delimiter=',',dtype=np.float,
usecols=(1,2,3,4,5),skiprows=1,unpack=True)
header = ['年末总人口','男性人口','女性人口','城镇人口','乡村人口']
#数据整理
a0,a1,a2,a3,a4,a5=a0[::-1],a1[::-1],a2[::-1],a3[::-1],a4[::-1],a5[::-1]
plt.figure(figsize=(12,6)) #设置绘图对象的大小(画布)
plt.xlabel('时间-年份') #设置x轴的标题
plt.ylabel('数值') #设置y轴的标题
plt.title('1996--2015人口数据统计表')
plt.plot(a0,a1,'r-',
a0,a2,'c--',
a0,a3,'-.',
a0,a4,':',
a0,a5,'--',linewidth='2',)
plt.legend(header) #设置图例
plt.show()
十、图例的设置
legend(title,loc,fontsize,facecolor,edgecolor,bbox_to_anchor)
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = 'SimHei'## 设置中文显示
matplotlib.rcParams['axes.unicode_minus'] = False
#按列读入数据
a0 = np.loadtxt('populations.csv',delimiter=',',dtype=np.str,
usecols=(0,),skiprows=1,unpack=False)
a1,a2,a3,a4,a5=np.loadtxt('populations.csv',delimiter=',',dtype=np.float,
usecols=(1,2,3,4,5),skiprows=1,unpack=True)
header = ['年末总人口','男性人口','女性人口','城镇人口','乡村人口']
#数据整理
a0,a1,a2,a3,a4,a5=a0[::-1],a1[::-1],a2[::-1],a3[::-1],a4[::-1],a5[::-1]
plt.figure(figsize=(11,5)) #设置绘图对象的大小(画布)
plt.xlabel('时间-年份') #设置x轴的标题
plt.ylabel('数值') #设置y轴的标题
plt.title('1996--2015人口数据统计表')
plt.plot(a0,a1,
a0,a2,
a0,a3,
a0,a4,
a0,a5,'--',linewidth='2',)
plt.legend(header,loc=1)
plt.show()
十一、保存与显示图
十二、实践练习
如附件2所示:
使用不同的颜色、不同的线条式样,绘制2007–2016年的全国就业人员,城镇就业人员和乡村就业人员的折线图(Employedpopulation.csv)。
其中,全国就业人员(万人)用红色的实线 '-‘表示,城镇就业人(万人)用绿色的长虚线’–'表示,乡村就业人员(万人)用蓝色的点线 '-.'表示。
import numpy as np
import matplotlib.pyplot as plt
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
#导入数据
Emp_data= np.loadtxt('Employedpopulation.csv',delimiter = ",",
usecols=(1,2,3,4,5,6,7,8,9,10),dtype=int)
#创建一个绘图对象, 并设置对象的宽度和高度
plt.figure(figsize=(8, 4))
plt.xlabel('年份')
plt.ylabel('人员(万人)')
year = [i for i in range(2007,2017)]
plt.ylim((30000,80000)) #设置y轴范围
plt.xticks(year,year) #设置刻度
plt.title("2007-2016年城镇、乡村和全部就业人员情况折线图")
#绘制就业人员拆线图
plt.plot(Emp_data[0],Emp_data[1],"r-",
Emp_data[0],Emp_data[2],"g--",
Emp_data[0],Emp_data[3],"b-.")
#添加图例
plt.legend(['全部就业','城镇就业','乡村就业'])
plt.savefig('就业人员折线图.png')
plt.show()
十三、散点图
-
散点图利用坐标点(散点)的分布形态反映特征间的统计关系的一种图形(坐标点的分布模式)。
pyplot.scatter(x, y, s=None, c=None, marker=None, alpha=None)
常用参数及说明:
x,y: 一对数据,也可接收array,表示x轴和y轴对应的数据。
s:指定点的大小。接收数值或者一维的array,若传入一维array则表示每个点的大小。默认为None
c:指定点的颜色。接收颜色或者一维的array,若传入一维array则表示每个点的颜色。默认为None
marker:点的形状。接收特定string。
alpha:透明度 -
某商场开业三个月后,有顾客反应商场一楼部分位置的手机信号不好,个别收银台有时无法正常使用微信支付或支付宝,商场内存在有些位置无法正常使用微信。为此,商场安排工作人员在不同位置对手机信号强度进行测试以便进一步提高服务质量和用户体验,测试数据保存于文件“商场手机信号强度.txt”中。 文件中每行使用逗号分隔的三个数字分别表示商场内一个位置的x、y坐标和信号强度, 其中x、y坐标值以商场西南角为坐标原点且向东为x正轴(共150米)、向北为y正轴(共30米),信号强度以0表示无信号、100表示最强。
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']='simhei'
#载入数据
data = np.loadtxt('商场手机信号强度.txt',dtype=np.int,delimiter=',')
plt.title('商场内手机信号强度',fontsize=16)
plt.ylabel('西\n南\n角\n向\n北',rotation=0,labelpad=16)
plt.xlabel('西南角向东')
x_data = data[:,0] # x坐标数据
y_data = data[:,1] # y坐标数据
s_data = data[:,2] # 信号强度数据
#绘制散点图
plt.scatter(x_data,y_data,s=s_data,marker='*',c ='b',alpha=0.4)
#plt.grid(True) #显示网格线
plt.show()
如果需要附件1和2做练习的话,请添加文章编辑员QQ:2122961493领取。
以上,关于Python语言采用matplotlib库进行数据可视化,你学会了吗?