数据可视化工程应用在各种场景中,比如总公司让分公司做年终汇报的时候得看到分公司销售每个月趋势图以了解分公司业务发展,美国总统选举得看到抽样调查结果分布图以了解哪些族群是支持者哪些族群是可以争取的,气象局得看到实时的气流动态图以确定台风通过时各地的气象状态,每年双十一的时候阿里巴巴演播室内实时显示的电商数据以展现哪些地方是热购人群分布地等等。
总之,数据可视化工程帮助我们更好的工作更好的生活。
小呆在工作中很努力,也做了很多,但是由于成果都没有做成图表,所以给老大的印象就是工作的效果不好,所以小呆拜托小瓜,请他教教怎么做。于是小瓜准备给小呆介绍python中的matplotlib完成作图。
数据可视化其实很多软件工具都可以实现,最常用的就是Excel,还有科研人员用的较多的Matlab等等。这里给大家介绍的是Python中的matplotlib库,它功能齐全,能够很好的替代Matlab,关键是它免费(Matlab表示宝宝心里苦/(ㄒoㄒ)/~~)。
matplotlib的使用基本上能够兼容matlab用户的习惯,所以学过matlab的同志们基本上是能够马上上手的。
让我们先画个图意思一下先,小瓜写下代码
'''模块导入'''
import matplotlib.pyplot as plt
import numpy as np
t = np.linspace(0, 2*np.pi,100)
y = np.sin(t)
plt.plot(t,y)
plt.show()
运行结果见下,一张一个周期的正弦曲线搞定了。当然我们肯定不满足与这么简单的程度。
下图是matplotlib作图的元素介绍图(摘自https://matplotlib.org/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py)
图1 matplotlib作图的元素介绍
主要元素:
元素 | 解释 |
---|---|
1. figure | 画板/图框:一个单独的弹出式的视窗,在它里面可以包含一下所有元素 |
2. axes | 轴系图:由坐标系轴系组成子图 |
3. subplot | 分视图:等于快速创建多个坐标系图 |
4. title | 标题 |
5. axis label | 轴标识 |
6. tick label | 刻度标识 |
7. ticks | 刻度 |
8. legend | 图例 |
9. spines | 轴 |
10. grid | 节点 |
11. markers | 数据标识符 |
matplotlib能作的常用的图有:
还以画正弦曲线为例,不过在画图上面做多一点设置,设置数据点标识、线条颜色、线宽、线条样式,增加标题,改变坐标轴范围等。
'''模块导入'''
import matplotlib.pyplot as plt
import numpy as np
t = np.linspace(0, 2*np.pi,100)
y = np.sin(t)
plt.plot(t, y, color = 'red', linewidth = 2.0, linestyle = '--')
#plot(xdata, ydata, linecolor, linewidth, linestyle)
plt.title('y = sin(t)', fontsize = 14, loc = 'center')
#title(label, fontdict, loc, pad)
plt.xlabel('t', fontsize = 14)
#xlabel(label, fontdict, labelpad)
plt.ylabel('y', fontsize = 14)
plt.xlim([0,10])
plt.ylim([-2,2])
plt.grid()
plt.show()
箱型图具体例子参见小呆学数据分析——异常值判定与处理(一),其中箱型图原理参见《小瓜讲数据分析——使用箱型图判定异常值》
下面演示一下画箱型图的方法。对于DataFrame类型的数据df,本身就有df.plot.box方法,对于非DataFrame类型,需要用plt.boxplot方法
品牌,日期,销量A,销量B
沙宣,20190101,200,199
沙宣,20190102,185,145
沙宣,20190103,300,185
沙宣,20190104,210,167
沙宣,20190105,201,174
沙宣,20190106,223,208
沙宣,20190107,195,215
沙宣,20190501,150,204
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
sales = pd.read_csv('shampoo_sales3.csv', encoding = 'gb2312')
plt.boxplot([sales ['销量A'], sales ['销量B']])
# another way: sales[['销量A', '销量B']].plot.box()
plt.show()
有时候可能只是想观察数据的分布图,那么可以绘制散点图。以logistic regression(逻辑回归)算法原理详解里面的二分类事件散点分布图为例,用到plt.scatter()方法。
input_data.txt
8.42383194320181 -0.408530918340288 0
9.23508197146775 -0.409948204795973 0
0.580765279496576 -0.279597802215932 0
7.09767621267017 -0.406498441260137 0
4.67937536514234 -0.398978513749255 0
......
6.16955623109348 -0.203747812388698 1
1.66149183322044 -0.206700226963393 1
2.74262556141998 -0.254027266166219 1
1.24804345641085 -0.241408809531456 1
0.808431917613837 -0.242017996831424 1
6.74094601972670 -0.373633464603415 1
import numpy as np
import matplotlib.pyplot as plt
x1_data = []
y1_data = []
x2_data = []
y2_data = []
with open('input_data.txt') as f:
for line in f.readlines():
line2 = line.strip().split('\t')
if int(line2[2])>0:
x1_data.append(np.float(line2[0]))
y1_data.append(np.float(line2[1]))
else:
x2_data.append(np.float(line2[0]))
y2_data.append(np.float(line2[1]))
plt.rcParams['font.sans-serif'] = ['SimHei']
fig = plt.figure()
plt.scatter(x1_data, y1_data, marker = 'o')
plt.scatter(x2_data, y2_data, marker = '+')
plt.xlabel('图1.1 线性可分的二分类问题', fontsize = 16)
plt.show()
制作柱状图能够一目了然的比较不同参量。
下面演示绘制柱状图(案例采用帮助文档demo),使用plt.bar()
import matplotlib.pyplot as plt
N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
menStd = (2, 3, 4, 1, 2)
womenStd = (3, 5, 2, 3, 3)
ind = np.arange(N) # the x locations for the groups
width = 0.35 # the width of the bars: can also be len(x) sequence
p1 = plt.bar(ind, menMeans, width, yerr=menStd)
p2 = plt.bar(ind, womenMeans, width,
bottom=menMeans, yerr=womenStd)
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(np.arange(0, 81, 10))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))
plt.show()