饼图
饼图用于显示各项相对总和的百分比大小
# 数据,会被饼图自动转换为百分比 p = [15,30,45,10] plt.pie(p) plt.show()
案例:2017年9国军费占比数据可视化
国家 军费占比 美国 0.5548467 中国 0.14444868 印度 0.05094268 沙特 0.04846696 俄国 0.046753 日本 0.04418206 英国 0.04161112 德国 0.03799276 法国 0.03075605
# 国名 mark = ['America','China','India','Saudi','Russia','Japan','Britain','Germany','France'] # 各国占9国总军费的比例 percent = [0.5548467,0.14444868,0.05094268,0.04846696,0.046753,0.04418206,0.04161112,0.03799276,0.03075605] plt.figure(figsize=(8, 8)) plt.pie( percent, # 百分比 labels = mark, # 名称 explode=(0,0.1,0,0,0,0,0,0,0), # 突出块,突出比例 autopct='%1.1f%%', # 显示百分比方式 startangle=-110, # 饼图起始的角度,度数,默认0为右侧水平180度开始,逆时针旋转 ) plt.axis('equal') # 正圆形饼图,x/y轴尺寸相等.默认是扁图 plt.show()
直方图
直方图是表达数据的分布情况的统计图表,一般用来表示同等区间内,某类数值出现的个数或频率(频率=出现次数/总数)
x轴表示分组数据,y轴表示分布情况
从频率分布直方图可以直观估计出:
- 众 数:频率分布直方图中最高矩形的底边中点的横坐标
- 中位数:把频率分布直方图分成两个面积相等部分的平行于Y轴的直线横坐标
直方图与柱状图的区别:
- 直方图:分区之间连续无间断,表示连续变量;值用矩形面积表示
- 条形图:各柱之间有间隙,表示孤立的、不连续分类变量;值用矩形长度表示
案例:1班和2班语文成绩统计数据可视化
# 成绩数据 h1 = [ 88.2, 83.5, 68.8, 85.4, 78.6, 69.3, 60.6, 91.2, 52.7, 85.9, 57.1, 68. , 66.6, 78.2, 78.8, 85. , 89.1, 74.4, 93.6, 75.7, 54.3, 55. , 90.9, 79.4, 94.4, 86.7, 82.4, 76.7, 78.7, 72.3, 83.9, 78.6, 80. , 70.5, 87.1, 80.3, 87.9, 65.1, 67.4, 61.5, 49.7, 77.1, 91.4, 72. , 61.5, 73.9, 76.9, 88.2, 51.2, 53.9] h2 = [ 79.5, 99. , 80. , 71. , 79.2, 85.6, 79.2, 68.8, 68.7, 96.5, 63.8, 81.8, 76.9, 80. , 73.8, 77.1, 79.6, 76.8, 73.9, 73.2, 66. , 76.2, 76.4, 65.3, 75.2, 74.5, 87.5, 78.4, 95. , 72.6, 86. , 71.7, 71. , 87.7, 83.9, 76.8, 72.3, 67. , 67.8, 79.6, 81.9, 83. , 65.6, 91.6, 75.5, 77.6, 82.8, 87.5, 75.1, 79.4]
plt.hist(h1)
(array([ 4., 3., 3., 3., 5., 4., 11., 5., 7., 5.]), array([49.7 , 54.17, 58.64, 63.11, 67.58, 72.05, 76.52, 80.99, 85.46, 89.93, 94.4 ]), <a list of 10 Patch objects>)
plt.hist( h1, # 直方图数据 10, # 直方个数 density=1, # 默认0 数据出现个数,1 出现个数归一化为出现的频率 histtype='bar', # 直方图样式:默认bar,stepfilled填充颜色,step不填充只有线条 facecolor='gray', # 直方图颜色 edgecolor = 'g', # 直方图边框颜色 alpha=0.3, ) # 直方图叠加 plt.hist(h2, 10, density=1, histtype='bar', alpha=0.3)
(array([0.02840909, 0.01704545, 0.04545455, 0.0625 , 0.05113636, 0.02840909, 0.02840909, 0.00568182, 0.00568182, 0.01136364]), array([63.8 , 67.32, 70.84, 74.36, 77.88, 81.4 , 84.92, 88.44, 91.96, 95.48, 99. ]), <a list of 10 Patch objects>)
箱线图
箱线图又名盒须图,是一种用作显示一组数据离散情况的统计图表,常用作多组数据的综合统计比较
四分位数:
第一四分位数(Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。 第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。 第三四分位数(Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。
箱线图主要包含5个统计量,从上到下,从高到低:
最大非异常值,上边线
Q3,箱体上边缘上四分位数
Q2,中位数线
Q1,箱体下边缘下四分位数
最小非异常值,下边线
除了上面5个统计量,上下边缘外侧可能还有异常值
Q3和Q1的差值,即四分位数差
- 大于Q3 1.5倍四分位数差的值,或者小于Q1 1.5倍四分位数差的值,划为异常值
a = [15,5,9,22,4,-5,45,-22] plt.boxplot(a) plt.show()
案例:某班级a/b/c三组学员数学成绩统计分析可视化
1 组别\编号 1 2 3 4 5 6 7 8 2 a 42 55 79 68 15 98 3 b 32 59 77 100 92 88 5 0 4 c 92 98 78 65 97 100 0
a = [42,55,79,68,15,98] b = [32,59,77,100,92,88,5,0] c = [92,98,78,65,97,100,0] plt.boxplot( (a, c, b), labels = ('a','c','b'), # 标签 showfliers = True, # 是否显示异常值,默认显示 whis = 1.5, # 指定异常值参数:默认1.5倍四分位差 showmeans = True, # 是否显示平均值,默认不显示 meanline = True, # 是否用线标示平均值,默认用点 widths = 0.5, # 柱子宽度 # vert = False, # 默认True纵向,False横向 patch_artist = True, # 是否填充颜色 boxprops = {'facecolor':'#ffff00','color':'green'}, # 箱体样式 ) plt.show()
众数、平均数,中位数的区别
- 众数:出现频率最高的数,没什么用
- 平均数:
- 对极端值非常敏感
- 中位数:
- 对极端值不敏感
总结:
比赛打分之所以使用平均数,利用平均值的敏感(中位数会出现大量的相同分数),
同时为了降低平均值的敏感程度,去掉最高分和最低分
import numpy as np
a = [1,2,3,4,5,6,7,8,9,10,11] # 平均值,中位数 np.mean(a), np.median(a)
(6.0, 6.0)
a = [1,2,3,4,5,6,7,8,9,10,11,1000] # 平均值,中位数 np.mean(a), np.median(a)
(88.83333333333333, 6.5)
热力图
热力图以二维形式展示数据的大小,主要用于数据的重要程度/相关度展示
a = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] plt.imshow(a)
<matplotlib.image.AxesImage at 0x13a29f28>
plt.imshow( a, # 数据 cmap='gray', # 配色,gray灰度 # origin='lower', # 水平翻转,默认upper,lower interpolation='lanczos', # 渲染,模糊 ) plt.colorbar() #侧栏
<matplotlib.colorbar.Colorbar at 0x110f9278>
例子:可视化班级同学成绩和座位关系
import numpy as np a = np.random.randint(0, 100, (10, 10))
array([[80, 32, 62, 43, 57, 46, 39, 75, 21, 29], [94, 82, 83, 83, 50, 52, 70, 52, 46, 66], [86, 21, 50, 6, 58, 53, 46, 41, 45, 56], [67, 38, 38, 80, 8, 99, 5, 52, 70, 64], [47, 16, 61, 32, 69, 88, 13, 26, 65, 39], [46, 97, 59, 99, 4, 14, 19, 55, 61, 58], [91, 0, 82, 62, 19, 85, 57, 31, 9, 36], [ 9, 75, 2, 2, 9, 73, 7, 73, 15, 54], [23, 98, 22, 22, 21, 72, 88, 67, 17, 83], [49, 56, 66, 5, 81, 57, 0, 38, 60, 31]])
plt.figure(figsize=(10, 10)) plt.imshow( a, # 数据 cmap='gray', # 配色,gray灰度 interpolation='lanczos', # 渲染,模糊 ) plt.xticks([0,1,2,3,4,5,6,7,8,9]) plt.yticks([0,1,2,3,4,5,6,7,8,9]) plt.grid() plt.colorbar() #侧栏