对比常用统计图

折线图:

  特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)

直方图:

  特点:绘制连续性的数据,展示一组或者多组数据的分布情况(统计)

条形图:

  特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差距(统计)

散点图:

  特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

绘制散点图(plt.scatter)

假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律?

a = [1,17,1611,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]

          数据来源: http://lishi.tianqi.com/ beijng/index.html

实现代码展示:

 import matplotlib.pyplot as plt

 plt.rc('font', family='SimHei', size=14)  ##显示中文
a = [1,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]
#3月份10月份的x范围
x_3 = range(1,len(a)+1)
x_10 = range(50,80)
#画布大小 还有清晰度
plt.figure(figsize=(20,8),dpi=80)
plt.scatter(x_3,a,label="3月") #加上别名标签以及散点图使用scatter方法实现
plt.scatter(x_10,b,label="10月")#加上别名标签 scatter 发散 散列的意思
#横坐标的显示刻度
_x = list(x_3) + list(x_10)
x_label = ["3月{}日".format(i) for i in range(1,32)]
x_label += ["10月{}日".format(n-50) for n in range(50,80)]
plt.xticks(_x[::3],x_label[::3],rotation=45)
#横纵坐标的显示标签 以及标题
plt.xlabel("日期")
plt.ylabel("最高气温(℃)")
plt.title("3月份与10月份白天气温分布图")
#根据个人需求是否保存plt.savefig("文件路径和名字")
#添加图例
plt.legend(loc="upper left") #展示出来
plt.show()

(备注)散点图的更多应用场景

  不同条件维度之间的内在关联

  观察数据的离散聚合程度

绘制条形图(plt.bar,plt.barh)

  假设你获取到了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]
单位:亿 数据来源: http://58921.com/ alltimne/2017

实现代码展示:
  1 import matplotlib.pyplot as plt
2
3 plt.rc('font', family='SimHei', size=14) #显示中文
4 a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑土",
"摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山",
"大闹天竺","金刚狼3:殊死-战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
5
6 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]
7 plt.figure(figsize=(20,8),dpi=100)
8 plt.grid(alpha=0.4)
9 _x = range(len(a))
10 plt.xticks(_x,a,rotation=90)
11
12 plt.xlabel("电影的名字")
13 plt.ylabel("票房(单位:亿)")
14 plt.title("电影票房直观图(2017)")
15
16 #条形图展示
17 plt.bar(a,b,width=0.5,label="票房数量")
18
19 plt.legend(loc="upper right")
20
21
22 plt.show()

这样看起来是不是感觉总觉得怪怪的,那么接下来换一种思路展示:

       将电影名字变成y轴  票房x轴 那么来试试看:

代码展示:

 import matplotlib.pyplot as plt

 plt.rc('font', family='SimHei', size=14)  #显示中文
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]
plt.figure(figsize=(20,8),dpi=100)
plt.grid(alpha=0.4)
_x = range(len(a))
plt.yticks(_x,a) plt.ylabel("电影的名字")
plt.xlabel("票房(单位:亿)")
plt.title("电影票房直观图(2017)") #条形图展示
plt.barh(a,b,height=0.5,label="票房数量")#注意 传入参数位置不变 但参数的width变成了height这是需要注意的 plt.legend(loc="upper right") plt.show()

这样大家是不是更加清晰,一目了然知道谁的票房最高,票房在那个范围内。(如歌不喜欢这个颜色,可以自己改动)

    

  注意 :
      传入参数位置不变 但参数的width变成了height这是需要注意的

        在提醒一下 图例legend放位置需要传入loc=“upper left”等

问题:初级单条直方图会了,那么要描绘多条直方图怎么描绘?

  绘制多条条形图

  假设你知道了列表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]

  数据来源: http:/ /www.cbooo.cn/ movieday
 import matplotlib.pyplot as plt

 #显示中文
plt.rc('font', family='SimHei', size=14)
#数据
a= ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_16= [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]
#画布
plt.figure(figsize=(20,8),dpi=100)
#标题标签 坐标轴标签
plt.title("三天各电影的票房数据情况")
plt.xlabel("电影名")
plt.ylabel("票房:单位(万)")
#画图注意宽度的采取 注意图形重盖
x_width = 0.15
x_14 = range(len(b_14))
x_15 = [i+x_width for i in x_14]
x_16 = [i+x_width for i in x_15]
#将电影名字还在三天的中间那条数据下面 这样更美观
plt.xticks(x_15,a)
#描绘出三天的数据
plt.bar(x_14,b_14,width=x_width,label="9月14号")
plt.bar(x_15,b_15,width=x_width,label="9月15号")
plt.bar(x_16,b_16,width=x_width,label="9月16号")
#图例位置
plt.legend(loc="upper right")
#展示在屏幕上
plt.show()

这样看起来是不是一目了然,直接知道每部电影在三天的票房情况,也可以预测以后的票房走势。

条形图的应用场景:(统计数量)

绘制直方图(hist())

  • 假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据?

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]


直方图(频数直方图、频率直方图(参数加上normed=True or 1)) 注意:直方图是对未进行统计的数据进行描绘 代码如下:   
import matplotlib.pyplot as plt
plt.rc("font",family="SimHei",size=14)
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]
"""统计直方图需要的数据是未进行统计整理过的,
需要原生态的数据,然后求所得数据的组数(num_bins)=(max(a)-min(a))//d(d是组距)
"""
#计算数组
d = 3
"""这个有问题 整除是整数就不会出现偏移
如果整除是小数,就会出现偏移"""
num_bins = (max(a)-min(a))//d
#设置图形大小
plt.figure(figsize=(20,8),dpi=80)
#设置直方图
plt.hist(a,num_bins,)#normed=True 这个参数添加就变成了频率分布直方图 #设置x轴的刻度
"""刻度的步调也就是相隔的长度一定要和组数相等 不然结果的图会出现偏移"""
plt.xticks(list(range(min(a),max(a)+d)[::3]))
plt.xlabel("电影时长")
plt.ylabel("每组时长的个数")
plt.title("250部电影时长统计直方图")
plt.grid(alpha=0.3) 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,57]

import matplotlib.pyplot as plt
plt.rc("font",family="SimHei",size=14) 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=100)
#标题 坐标轴标签
plt.xlabel("花费的时间")
plt.ylabel("每个时间段人数")
plt.title("124百万美国人从家到上班花费的时间统计图") plt.bar(range(len(quantity)),quantity,width=1)
#减去0.5才可以从开始标记
_x = [i-0.5 for i in range(len(quantity)+1)]
#在加150目的是为了上面数据完整性
_x_label = interval+[150]
#牢记第一个参数 是关于x的刻度 第二个参数与第一个参数一一对应替换第一个参数
plt.xticks(_x,_x_label) plt.show()

那些数据能够绘制直方图:

        刚才绘制是统计过后的,为了达到目的效果,需要绘制条形图。

        所以:一般来说使用plt.hist()方法是对那些还没有统计的数据也就是零散数据。 

 直方图的更多应用场景:
    用户的年龄分布状态
    一段时间内用户点击次数的分布状态
    用户活跃时间分布状态(一天)

matplotlib常见问题总结

  • 1、应该选择那种图形来呈现数据
  • 2、matplotlib.pyplot.plot(x,y)
  • 3、matplotlib.pyplot.bar(x,y)(barh)
  • 4、plt.scatter(x,y)
  • 5、plt.hist(data,num_bins,normed)
  • 6、xticks和yticks的设置(刻度)
  • 7、label和title、grid的设置(标签,标题,网格)
  • 8、绘图大小和保存图片

matplotlib使用流程

  • 1、明确问题
  • 2、选择图形呈现方式
  • 3、准备数据
  • 4、绘图和图形完善

    matplotlib更多的图形样式

  • 官网:http://matplotlib.org/gallery/index.html
  • 百度:echart(前端js图形)
  • 更多绘图工具:plotly:可视化工具
    • 用法简单,照着文档写即可
    • 地址:htpps://plot.ly/python/


Matplotlib散点图、条形图、直方图-02的更多相关文章

  1. python matplotlib.pyplot 条形图详解

    python matplotlib.pyplot 条形图详解 一.创建直方图 可以用bar函数来创建直方图 然后用show函数显示直方图 比如: import matplotlib.pyplot as ...

  2. 利用pandas读取Excel表格,用matplotlib.pyplot绘制直方图、折线图、饼图

    利用pandas读取Excel表格,用matplotlib.pyplot绘制直方图.折线图.饼图 数据: 折线图代码: import  pandas  as pdimport  matplotlib. ...

  3. matplotlib如何绘制直方图、条形图和饼图

    1 绘制直方图: import matplotlib.pyplot as plt import numpy as np import matplotlib def hist1(): # 设置matpl ...

  4. matplotlib库之直方图

    例题:假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据? 一些概念及问题: 把数据分 ...

  5. Python:matplotlib绘制条形图

    条形图,也称柱状图,看起来像直方图,但完是两码事.条形图根据不同的x值,为每个x指定一个高度y,画一个一定宽度的条形:而直方图是对数据集进行区间划分,为每个区间画条形.     将上面的代码稍微修改一 ...

  6. matplotlib 散点图scatter

    最近开始学习python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...

  7. Python 绘图与可视化 matplotlib 散点图、numpy模块的random()

    效果: 代码: def scatter_curve(): # plt.subplot(1,1,1) n=1024 X=np.random.normal(0,1,n) Y=np.random.norma ...

  8. matplotlib散点图笔记

    定义: 由一组不连续的点完成的图形 散点图: 包含正相关性,负相关性和不相关性. 散点图生成函数: plt.scatter(x,y) 演示代码如下: import numpy as np import ...

  9. Python 绘图与可视化 matplotlib 动态条形图 bar

    bar的参考链接:https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.bar.html 第一种办法 一种方法是每次都重新画,包括清除f ...

随机推荐

  1. CMS和G1的区别

    CMS:以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现 过程: 1.初始标记:独占PUC,仅标记GCroots能直接关联的对象 2.并发标记:可以和用户线程并行执行,标记所有可达对象 ...

  2. Windows上快捷登陆应用程序

    在Windows上有些程序双击后,还需要输入用户名密码等,填写很多信息后才开始使用. 有些程序本身实现了保存信息,或者可以自动登陆. 但也有些程序无信息保存和自动登陆功能,如果经常使用,每次都填写觉得 ...

  3. 矩阵微分与向量函数Taylor展开

    参考博客:https://blog.csdn.net/a_big_pig/article/details/78994033

  4. React Native的APP打包教程

    1.改软件的名称 2.改软件的图标 3.给做好的项目打成APP包 改软件的名称 找到项目的改名的位置 然后用记事本打开strings.xml,然后改自己想要的名字 改软件的图标 找到如下5个文件,然后 ...

  5. Docker学习总结(三)--常用命令

    镜像相关命令 查看镜像 docker images 返回列表字段含义如下: 字段名称 字段含义 REPOSITORY 镜像名称 TAG 镜像标签 IMAGE ID 镜像 ID CREATED 镜像创建 ...

  6. python 17 内置模块

    目录 1. 序列化模块 1.1 json 模块 1.2 pickle 模块 2. os 模块 3. sys 模块 4. hashlib 加密.摘要 4.1 加密 4.2 加盐 4.3 文件一致性校验 ...

  7. 【原创】为什么Redis集群有16384个槽

    引言 我在<那些年用过的Redis集群架构(含面试解析)>一文里提到过,现在redis集群架构,redis cluster用的会比较多. 如下图所示 对于客户端请求的key,根据公式HAS ...

  8. 通过Callable接口创建线程

    通过Callable接口创建线程 一.前言 Java中创建线程的方式有四中,前两种在前面我已经详细介绍过了(Runnable和Thread),不清楚的朋友们可看这里: Java多线程之线程的启动以及J ...

  9. javaScript 基础知识汇总(六)

    1.基本类型与对象的区别 基本类型:是原始类型的中的一种值. 在JavaScript中有6中基本类型:string number  boolean  symbol  null  undefined 对 ...

  10. Codeforces Round #511 (Div. 2)-C - Enlarge GCD (素数筛)

    传送门:http://codeforces.com/contest/1047/problem/C 题意: 给定n个数,问最少要去掉几个数,使得剩下的数gcd 大于原来n个数的gcd值. 思路: 自己一 ...