2.数据可视化的意义
数据可视化是借助图形化的手段将一组数据以图像的形式表示,并利用数据分析和开发工具发现其中未知信息的数据处理过程。
3.常用图表的定义和作用
折线图是将数据标注成点,并通过直线将这些点按某种顺序连接而成的图表,它以折线的方式形象的反映事物沿某个纬度的变化趋势,能够清晰地展开数据增减的趋势、速率、规律及峰值等特征。(天气)
柱形图是由一系列宽度相等的纵向矩形条组成的图表,它利用矩形条的高度表示数值,以此反映不同分类数据之间的差异。(营业收入情况)离散型数据
条形图是横置的柱形图,由一系列高度相等,长短不一的横向矩形条组成。
堆积图分为堆积面积图、堆积柱形图和堆积条形图。反应每个构成在总体中的比重(一次性能源消费结构)
直方图又称质量分布图,是由一系列高低不等的纵向矩形条或线段组成的图表,用于反应数据的分布和波动情况。(质量级别)连续性数据
箱形图是一种利用数据中的5个统计量(最小值、下四分位数、中位数、上位分位数和最大值)描述数据的图表,主要用于反映一组或多组数据的对称性、分布程度等信息,识别异常值,判断偏态与尾重,比较数据形状(产品耐用性)
饼图是由若干个面积大小不一、以条形或颜色填充的扇形组成的圆形图表,它使用圆表示数据的总量,组成圆的每个扇形表示数据中各项占总量的比例大小,主要用于显示数据中各项大小与各项总和的比例。(消费支出情况)
散点图是由若干个数据点组成的图表,主要用于判断两变量之间是否存在某种关联,或者总结数据点的分布模式。两变量的相关性(股票利率)
气泡图是一种能够展示多变量变化的图表。
误差棒图是使用误差棒注明被测量数据的不确定大小的图表,用于表示测量数据中客观存在的测量偏差。
雷达图由一组坐标轴和多个等距同心圆或多边形组成,是一种表现多维数据的图表,对多指标对象作出全局性、整体性评价(霍兰德)
统计地图是一种以地图为背景,使用各种浅纹、色彩、几何图形或实物形象标注指标数值及其在不同地理位置的分布情况的图表。
3D图表是一类在三维坐标系中呈现数据的图表。
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(1,16)
y_max =[32, 33, 34, 34, 33, 31, 30, 29, 30, 29, 26, 23, 21, 25, 31]
y_min =[19, 19, 20, 22, 22, 21, 22, 16, 18, 18, 17, 14, 15, 16 , 16]
plt.plot(x, y_max, marker='.', label='最高温度',color='#8a2e76',ls='--')
plt.plot(x, y_min, marker='.', label='最低温度',color='k',ls=':')
plt.title('未来15天最高气温和最低气温的走势')
plt.xlabel('日期')
plt.ylabel('温度($^\circ$C)')
plt.ylim(0, 40)
plt.legend()
plt.grid(b=True,linewidth=0.5)
plt.show()
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#防乱码
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#柱形图
bar_width = 0.3
x = np.array([0,1,2,3,4])
y1=[74,93,84,81,79]
y2=[88,83,97,74,72]
plt.ylabel('成绩')
plt.xlabel('学科')
plt.title('甲乙学生五门成绩对比')
plt.bar(x-0.5*bar_width,y1,bar_width,color='r')
plt.bar(x+0.5*bar_width,y2,bar_width,color='b')
data=['语文','数学','英语','物理','化学']
plt.xticks(x,data)
plt.legend(['甲','乙'])
plt.show()
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#防乱码
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#柱形图
bar_width = 0.3
x = np.arange(5)
y1=[74,93,84,81,79]
y2=[88,83,97,74,72]
plt.ylabel('成绩')
plt.xlabel('学科')
plt.title('甲乙学生五门成绩对比')
plt.bar(x-0.5*bar_width,y1,bar_width,color='r',tick_label=['语文','数学','英语','物理','化学'],label='甲')
plt.bar(x+0.5*bar_width,y2,bar_width,color='b',label='乙')
#data=['语文','数学','英语','物理','化学']
#plt.xticks(x,data)
plt.legend()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = np.array([931,430,210,68,413,148,100,310])
pie_labels = np.array(['伙食','零食','学习','通讯','服饰','交通','娱乐','其他'])
plt.title('6月消费情况')
# 绘制圆环图:外圆半径为1.3,楔形宽度为0.75
plt.pie(data, radius=1.3, wedgeprops={'width': 0.75}, labels=pie_labels,
autopct='%3.1f%%',colors=['r','g','b','y','r','g','b','y'])
plt.show()
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#防乱码
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#柱形图
bar_width = 0.3
x = np.array([0,1,2,3,4,5])
y1=[174,93,284,21,43,74]
y2=[88,283,97,34,75,46]
plt.ylabel('电量')
plt.xlabel('电种')
plt.title('甲乙两国发电量对比')
plt.bar(x-0.5*bar_width,y1,bar_width,color='r')
plt.bar(x+0.5*bar_width,y2,bar_width,color='b')
data=['水电','火电','核电','风电','太阳能','其他']
plt.xticks(x,data)
plt.legend(['甲','乙'])
plt.show()
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(8,6))
x = np.array([542,334,189,2304,830,810,410])
pie_labels = ['东北','华北','华东','华中','华南','西南','西北']
plt.title('2023级新手来源地区')
# 绘制圆环图:外圆半径为1.3,楔形宽度为0.8
plt.pie(x, radius=1.3, wedgeprops={'width': 0.8}, labels=pie_labels,
autopct='%3.1f%%',colors=['r','g','b','y','r','g','b'])
plt.show()
# 2.1 绘制折线图
## 2.1.2 实例1:未来15天最高气温和最低气温
# 01_maximum_minimum_temperatures
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 16)
y_max = np.array([32, 33, 34, 34, 33, 31, 30, 29, 30, 29, 26, 23, 21, 25, 31])
y_min = np.array([19, 19, 20, 22, 22, 21, 22, 16, 18, 18, 17, 14, 15, 16, 16])
# 绘制折线图
plt.plot(x, y_max)
plt.plot(x, y_min)
plt.show()
# 2.2 绘制柱形图或堆积柱形图
## 2.2.2 实例2:2013—2019财年阿里巴巴淘宝和天猫平台的GMV
# 02_taobao_and_tianmao_GMV
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 8)
y = np.array([10770, 16780, 24440, 30920, 37670, 48200, 57270])
# 绘制柱形图
plt.bar(x, y, tick_label=["FY2013", "FY2014", "FY2015",
"FY2016", "FY2017", "FY2018", "FY2019"], width=0.5)
plt.show()
# 2.3 绘制条形图或堆积条形图
## 2.3.2 实例3:各商品种类的网购替代率
# 03_substitution_rate_online
import matplotlib.pyplot as plt
import numpy as np
# 显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.array([0.959, 0.951, 0.935, 0.924, 0.893,
0.892, 0.865, 0.863, 0.860, 0.856,
0.854, 0.835, 0.826, 0.816, 0.798,
0.765, 0.763, 0.67])
y = np.arange(1, 19)
labels = ["家政、家教、保姆等生活服务", "飞机票、火车票", "家具", "手机、手机配件",
"计算机及其配套产品", "汽车用品", "通信充值、游戏充值", "个人护理用品",
"书报杂志及音像制品", "餐饮、旅游、住宿", "家用电器",
"食品、饮料、烟酒、保健品", "家庭日杂用品", "保险、演出票务",
"服装、鞋帽、家用纺织品", "数码产品", "其他商品和服务", "工艺品、收藏品"]
# 绘制条形图
plt.barh(y, x, tick_label=labels, align="center", height=0.6)
plt.show()
# 2.4 绘制堆积面积图
## 2.4.2 实例4:物流公司物流费用统计##
# 04_logistics_cost_statistics
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 13)
y_a = np.array([198, 215, 245, 222, 200, 236, 201, 253, 236, 200, 266, 290])
y_b = np.array([203, 236, 200, 236, 269, 216, 298, 333, 301, 349, 360, 368])
y_c = np.array([185, 205, 226, 199, 238, 200, 250, 209, 246, 219, 253, 288])
# 绘制堆积面积图
plt.stackplot(x, y_a, y_b, y_c)
plt.show()
# 2.5 绘制直方图#
## 2.5.2 实例5:人脸识别的灰度直方图
# 05_face_recognition
import matplotlib.pyplot as plt
import numpy as np
# 10000 个随机数
random_state = np.random.RandomState(19680801)
random_x = random_state.randn(10000)
# 绘制包含 25个矩形条的直方图
plt.hist(random_x, bins=25)
plt.show()
# 2.6 绘制饼图或圆环图
## 2.6.2 实例6:支付宝月账单报告
# 06_monthly_bills_of_alipay
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
# 饼图外侧的说明文字
kinds = ['购物', '人情往来', '餐饮美食', '通信物流', '生活日用',
'交通出行', '休闲娱乐', '其他']
# 饼图的数据
money_scale = [800 / 3000, 100 / 3000, 1000 / 3000, 200 / 3000,
300 / 3000, 200 / 3000, 200 / 3000, 200 / 3000]
dev_position = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
# 绘制饼图
plt.pie(money_scale, labels=kinds, autopct='%3.1f%%', shadow=True,
explode=dev_position, startangle=90)
plt.show()
# 2.7 绘制散点图或气泡图
## 2.7.2 实例7:汽车速度与制动距离的关系
# 07_vehicle_speed_and_braking_distance
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 准备 x 轴和 y 轴的数据
x_speed = np.arange(10, 210, 10)
y_distance = np.array([0.5, 2.0, 4.4, 7.9, 12.3,
17.7, 24.1, 31.5, 39.9, 49.2,
59.5, 70.8, 83.1, 96.4, 110.7,
126.0, 142.2, 159.4, 177.6, 196.8])
# 绘制散点图
plt.scatter(x_speed, y_distance, s=50, alpha=0.9)
plt.show()
# 2.8 绘制箱形图
## 2.8.2 实例8:2017年和2018年全国发电量统计
# 08_generation_capacity
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
data_2018 = np.array([5200, 5254.5, 5283.4, 5107.8, 5443.3, 5550.6,
6400.2, 6404.9, 5483.1, 5330.2, 5543, 6199.9])
data_2017 = np.array([4605.2, 4710.3, 5168.9, 4767.2, 4947, 5203,
6047.4, 5945.5, 5219.6, 5038.1, 5196.3, 5698.6])
# 绘制箱形图
plt.boxplot([data_2018, data_2017], labels=('2018年', '2017年'),
meanline=True, widths=0.5, vert=False, patch_artist=True)
plt.show()
# 2.9 绘制雷达图
## 2.9.2 实例9:霍兰德职业兴趣测试
# 09_holland_professional_interest_test
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
dim_num = 6
data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
[0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
[0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
[0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
[0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
[0.34, 0.31, 0.38, 0.40, 0.92, 0.28]])
angles = np.linspace(0, 2 * np.pi, dim_num, endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
data = np.concatenate((data, [data[0]]))
# 维度标签
radar_labels = ['研究型(I)', '艺术型(A)', '社会型(S)',
'企业型(E)', '传统型(C)', '现实型(R)']
radar_labels = np.concatenate((radar_labels, [radar_labels[0]]))
# 绘制雷达图
plt.polar(angles, data)
# 设置极坐标的标签
plt.thetagrids(angles * 180/np.pi, labels=radar_labels)
# 填充多边形
plt.fill(angles, data, alpha=0.25)
plt.show()
# 2.10 绘制误差棒图
## 2.10.2 实例10:4个树种不同季节的细根生物量
# 10_fine_root_biomass
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 准备 x 轴和 y 轴的数据
x = np.arange(3)
y1 = np.array([2.04, 1.57, 1.63])
y2 = np.array([1.69, 1.61, 1.64])
y3 = np.array([4.65, 4.99, 4.94])
y4 = np.array([3.39, 2.33, 4.10])
# 指定测量偏差
error1 = [0.16, 0.08, 0.10]
error2 = [0.27, 0.14, 0.14]
error3 = [0.34, 0.32, 0.29]
error4 = [0.23, 0.23, 0.39]
bar_width = 0.2
# 绘制柱形图
plt.bar(x, y1, bar_width)
plt.bar(x + bar_width, y2, bar_width, align="center",
tick_label=["春季", "夏季", "秋季"])
plt.bar(x + 2*bar_width, y3, bar_width)
plt.bar(x + 3*bar_width, y4, bar_width)
# 绘制误差棒 : 横杆大小为 3, 线条宽度为 3, 线条颜色为黑色, 数据点标记为像素点
plt.errorbar(x, y1, yerr=error1, capsize=3, elinewidth=2, fmt=' k,')
plt.errorbar(x + bar_width, y2, yerr=error2, capsize=3, elinewidth=2, fmt='k,')
plt.errorbar(x + 2*bar_width, y3, yerr=error3, capsize=3, elinewidth=2, fmt='k,')
plt.errorbar(x + 3*bar_width, y4, yerr=error4, capsize=3, elinewidth=2, fmt='k,')
plt.show()