从大量数据中,寻找规律,对大量数据进行统计和分析,统计出感兴趣的规律,供后续使用。绘图使我们更好的理解数据,从一堆数据里面找出经验或结论供他人使用。
数据分析是用适当的方法对收集来的大量数据进行分析,帮助人们做出判断,以便采取行动。
数据分析的流程:
提出问题-》准备数据-》分析数据-》获得结论-》成果可视化, …
conda: https://www.anaconda.com/download/
创建环境:
conda create --name env_name python=3
切换环境:
windows: activate env_name
linux/macos: source activate env_name
jupyter notebook:一款变成、文档、笔记、展示软件。
启动命令:
jupyter notebook
纯用python实现的库,matplotlib能将数据进行可视化,更直观地呈现,使数据更加客观、更具说服力。
matplotlib是最流行的python底层绘图库,主要做数据可视化图标,名字取材于matlab.
matplotlib能够绘制折线图,散点图,柱状图,直方图,箱线图,饼图等。
但是,我们需要知道不同的统计图到底能够表示出什么,以此来决定选择哪种统计图来更直观的呈现我们的数据
plt.plot(x,y)画一条线
多个plt.plot画多条线
from matplotlib import pyplot as plt #导入pyplot
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y) #传入x,y,通过plot绘制出折线图
plt.show() #展示图形
生成指定大小的高清图,必须在plt.plot函数之前设置。
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi=80) #figure图形图标,在这里指的是我们画的图。 dpi: 每英寸上点的个数
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y)
plt.show()
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi=80) #figure图形图标,在这里指的是我们画的图。 dpi: 每英寸上点的个数
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y)
plt.savefig('d:\pic.png') #保存图片
plt.show()
比如x轴和y轴表示什么,这个图表示什么
from matplotlib import pyplot as plt
#设置图片大小
fig = plt.figure(figsize=(20,8), dpi=80) #figure图形图标,在这里指的是我们画的图。 dpi: 每英寸上点的个数
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
#绘图
plt.plot(x,y)
#设置x的刻度
plt.xticks(range(2,25)) #x轴绘制24个点
#设置y的刻度
plt.yticks(range(min(y),max(y)+1))
#展示
plt.show()
将数字刻度与字符串刻度一一对应,数据长度必须一样。
如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?
a= [random.randint(20,35) for i in range(120)]
import random
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi = 80)
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.plot(x,y)
#调整x的刻度表示
_x = x[::10]
_xticks_labels = ['{0}:{1}'.format(10+int(i/60),i%60) for i in _x]
plt.xticks(x[::10],_xticks_labels, rotation = 90) #如果x轴刻度只有数字,那么只需要传入数字;否则需要传入字符串和原始x刻度,旋转90度表示
plt.show(
matplotlib默认不支持中文字符,因为默认的英文字体无法显示汉字。
查看linux/mac/windows下面支持的字体:
fc-list 查看支持的字体
fc-list :lang=zh 查看支持的中文(冒号前面有空格)
如何修改matplotlib的默认字体?
通过matplotlib.rc函数可以修改,具体方法参见源码(windows/linux)
通过matplotlib 下的font_manager模块可以解决(windows/linux/mac)
matplotlib.rc函数
font = {'family' : 'monospace',
'weight' : 'bold',
'size' : 'larger'}
matplotlib.rc('font', **font)
font_manager模块
使用fc-list查看字体文件路径,然后利用该路径实例化font_manager
font_manager.FontProperties(fname=“C:/WINDOWS/Fonts/msyhbd.ttc”)
plt.xticks(x[::10],_xticks_labels, rotation = 45, fontproperties = my_font)
import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/WINDOWS/Fonts/msyhbd.ttc")
fig = plt.figure(figsize=(20,8), dpi = 80)
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.plot(x,y)
#调整x的刻度表示
_x = x[::10]
_xticks_labels = ['{0}点{1}分'.format(10+int(i/60),i%60) for i in _x]
plt.xticks(x[::10],_xticks_labels, rotation = 45, fontproperties = my_font) #如果x轴刻度只有数字,那么只需要传入数字;否则需要传入字符串和原始x刻度,旋转45度表示
plt.show()
import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/WINDOWS/Fonts/msyhbd.ttc")
fig = plt.figure(figsize=(20,8), dpi = 80)
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.plot(x,y)
#调整x的刻度表示
_x = x[::10]
_xticks_labels = ['{0}点{1}分'.format(10+int(i/60),i%60) for i in _x]
plt.xticks(x[::10],_xticks_labels, rotation = 45, fontproperties = my_font) #如果x轴刻度只有数字,那么只需要传入数字;否则需要传入字符串和原始x刻度,旋转45度表示
plt.xlabel('时间',fontproperties = my_font)
plt.ylabel('温度 单位(摄氏度)',fontproperties = my_font)
plt.title('10点到12点每分钟气温的变化情况', fontproperties = my_font)
plt.show()
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname = 'C:/WINDOWS/Fonts/msyhbd.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
x = range(11,31)
plt.figure(figsize=(20,8), dpi= 80)
plt.plot(x,y)
#设置x轴刻度
x_ticks_labels = [str(x) + '岁' for x in x]
plt.xticks(x,x_ticks_labels, fontproperties = my_font)
#绘制网格
plt.grid(alpha = 0.4) #alpha设置网格透明度
#展示
plt.show()
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname = 'C:/WINDOWS/Fonts/msyhbd.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
x = range(11,31)
#设置图形大小
plt.figure(figsize=(20,8), dpi= 80)
plt.plot(x,y, label = '自己')
plt.plot(x,y2, label = '同桌')
#设置x轴刻度
x_ticks_labels = [str(x) + '岁' for x in x]
plt.xticks(x,x_ticks_labels, fontproperties = my_font)
#绘制网格
plt.grid(alpha = 0.4) #alpha设置网格透明度
#添加图例:告诉别人,每条线代表什么意思
plt.legend(prop = my_font, loc = 'upper left') # loc设置图例的位置, 这里设置左上角
#展示
plt.show()
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname = 'C:/WINDOWS/Fonts/msyhbd.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
x = range(11,31)
#设置图形大小
plt.figure(figsize=(20,8), dpi= 80)
# 绘图并设置线条颜色,样式
plt.plot(x,y, label = '自己', color = 'orange', linestyle = ':')
plt.plot(x,y2, label = '同桌', color = 'cyan', linestyle = '-.')
#设置x轴刻度
x_ticks_labels = [str(x) + '岁' for x in x]
plt.xticks(x,x_ticks_labels, fontproperties = my_font)
#绘制网格
plt.grid(alpha = 0.4, linestyle = '--') #alpha设置透明度, linestype设置线条样式
#添加图例:告诉别人,每条线代表什么意思
plt.legend(prop = my_font, loc = 'upper left') # loc设置图例的位置, 这里设置左上角
#展示
plt.show()
以折线的上升或下降来表示统计数量的增减变化的统计图。
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
由一系列高度不等的纵向条纹或线段表示数据分布的情况。
一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)
排列在工作表的列或行中的数据可以绘制到条形图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量
之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律?
a = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
b =[26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
y1 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y2 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
x1 = range(1,32)
x2 = range(51,82)
#设置图像大小
fig = plt.figure(figsize=(20,8), dpi = 80)
#使用sactter绘制散点图,和之前绘制折线图的唯一区别
plt.scatter(x1,y1, label='3月份',)
plt.scatter(x2,y2, label='4月份')
#调整x轴的刻度
x1_labels = ['3月{}日'.format(i) for i in x1[::3]]
x2_labels = ['10月{}日'.format(i%50) for i in x2[::3]]
plt.xticks(list(x1[::3]) + list(x2[::3]), x1_labels + x2_labels, fontproperties = my_font, rotation = 45)
#添加描述信息
plt.xlabel('时间', fontproperties = my_font)
plt.ylabel('温度', fontproperties = my_font)
plt.title('3月和10月份的温度变化', fontproperties = my_font)
#添加图例
plt.legend(prop = my_font)
#展示
plt.show()
示例一:假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?
a = [“战狼2”,“速度与激情8”,“功夫瑜伽”,“西游伏妖篇”,“变形金刚5:最后的骑士”,“摔跤吧!爸爸”,“加勒比海盗5:死无对证”,“金刚:骷髅岛”,“极限特工:终极回归”,“生化危机6:终章”,“乘风破浪”,“神偷奶爸3”,“智取威虎山”,“大闹天竺”,“金刚狼3:殊死一战”,“蜘蛛侠:英雄归来”,“悟空传”,“银河护卫队2”,“情圣”,“新木乃伊”,]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] 单位:亿
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
x_labels = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:\n最后的骑士","摔跤吧!\n爸爸","加勒比海盗5:\n死无对证","金刚:\n骷髅岛","极限特工:\n终极回归","生化危机6:\n终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:\n殊死一战","蜘蛛侠:\n英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
x = range(len(x_labels))
y = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
#设置图形大小
fig = plt.figure(figsize= (15,10), dpi = 80) # figsize(w,h)
#绘制条形图
plt.bar(x,y, width= 0.7, label='电影销量')
#设置x的刻度
plt.xticks(x, x_labels, fontproperties = my_font, rotation = 90)
plt.legend(prop = my_font)
# 展示
plt.show()
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
x_labels = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
x = range(len(x_labels))
y = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
#设置图形大小
fig = plt.figure(figsize= (15,10), dpi = 80) # figsize(w,h)
#绘制条形图
plt.barh(x,y, height= 0.3, label='电影销量',color = 'orange')
#设置x的刻度
plt.yticks(x, x_labels, fontproperties = my_font)
#添加网格
plt.grid(alpha = 0.3)
# 展示
plt.show()
示例二:假设你知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?
a = [“猩球崛起3:终极之战”,“敦刻尔克”,“蜘蛛侠:英雄归来”,“战狼2”]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]
from turtle import width
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
x_labels = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
y1 = [15746,312,4497,319]
y2 = [12357,156,2045,168]
y3 = [2358,399,2358,362]
x1 = list(range(len(x_labels)))
x2 = [i+0.2 for i in x1]
x3 = [i+0.4 for i in x1]
#设置图形大小
plt.figure(figsize=(20,8), dpi = 80)
#画多个条形图
plt.bar(x1,y1, width=0.2, label='9月14日')
plt.bar(x2,y2, width=0.2, label='9月15日')
plt.bar(x3,y3, width=0.2, label='9月16日')
#设置x轴的刻度
plt.xticks(x2,x_labels, fontproperties = my_font)
#设置图例
plt.legend(prop = my_font)
#展示
plt.show()
示例三、在美国2004年人口普查发现有124 million的人在离家相对较远的地方工作。根据他们从家到上班地点所需要的时间,通过抽样统计(最后一列)出了下表的数据,这些数据能够绘制成直方图么?
interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
from matplotlib import pyplot as plt
from matplotlib import font_manager
interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
#设置图形大小
plt.figure(figsize= (20,8), dpi = 80)
#绘制条形图
plt.bar(range(len(quantity)), quantity, width = 1)
_x = [i-0.5 for i in range(13)]
_xtick_labels = interval + [150]
plt.xticks(_x, _xtick_labels)
#网格
plt.grid()
#展示
plt.show()
假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据?
from matplotlib import pyplot as plt
from matplotlib import font_manager
a = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
#计算组数
d = 3 #组距,根据这个组距调整分成多少个bin
num_bins = (max(a) - min(a)) //d
plt.figure(figsize=(20,8), dpi = 80)
# 绘制频数分布直方图
plt.hist(a, num_bins)
# 绘制频率分布直方图
# plt.hist(a, num_bins, density = True)
# 设置x轴刻度 这里直接传入数字刻度
plt.xticks(range(min(a), max(a)+d, d))
#设置网格
plt.grid()
#展示
plt.show()
plotly:可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib和pandas
使用用法:简单,照着文档写即可。
文档地址: https://plot.ly/python/