本篇博客介绍数据可视化的13个图表基础案例,共同作者@西西想上岸
数据可视化基本图
准备相关包:
#相关包的导入
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
#中文设置
matplotlib.rc("font",family='MicroSoft YaHei')
1.折线图
通过查询广东省官方数据,获得2010年-2022年广东省全部工业增加值同比增长和规模以上工业增加值同比增长数据,并在同一个图中绘制出折线。
#数据
x_values = ['2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022']
y1_values = [14.9, 11.6, 7.6, 8.0, 7.8, 6.8, 6.4, 7.0, 5.9, 4.6, 1.3, 9.3, 2.6]
y2_values = [16.8, 12.6, 8.4, 8.7, 8.4, 7.2, 6.7, 7.2, 6.3, 4.7, 1.5, 9.0, 1.6]
#创建图形
plt.figure(figsize=(8,4.5))
# 只显示水平网格线
plt.gca().yaxis.grid(True,alpha=0.8,linewidth=0.2,)
#绘制第一条线
plt.plot(x_values, y1_values, label='全部工业增加值同比增长(%)', color='#87CEFA',marker='.')
#绘制第二条线
plt.plot(x_values, y2_values, label='规模以上工业增加值同比增长(%)', color='#DA70D6',marker='.')
#添加标题和标签
plt.title('广东省工业生产')
plt.xlabel('年')
plt.ylabel('增长率(单位:%)')
#添加图例
plt.legend()
#显示图形
plt.show()
从广东省工业生产图中可以直接反映2010年-2022年的两项工业增长值的同比增长率变化情况,可以看出2010-2020年两项工业增值同比增长率都在减小,2020年达到最低值在后来两年产生大的起伏跌宕。
折线图能够清晰地展示数据增减的趋势、速率、规律和峰值等。
2.柱形图(+折线图)
数据来源:https://gddata.gd.gov.cn/opdata/index
导入为文件:data2.csv
通过查询广东省官方数据,获得2010年-2022年广东省每年等地第一、二、三产业增加值数据以及地区生产总值,并在同一个图中绘制出每年三大产业增加值的柱形图和总生产值的折线。
# 读取CSV文件()
data = pd.read_csv('data2.csv',header=None)
x_values=list(data.loc[0][1:])
total= list(data.loc[1][1:])
value1 =list(data.loc[2][1:]) # 变量对应的第一个值
value2 =list(data.loc[3][1:]) # 变量对应的第二个值
value3 =list(data.loc[4][1:])# 变量对应的第三个值
# 创建图形
plt.figure(figsize=(8,4.5))
# 只显示水平网格线
plt.gca().yaxis.grid(True,alpha=0.8,linewidth=0.2,zorder=0)
# 设置柱子的宽度
bar_width = 0.25
# 设置x轴位置
x = np.arange(len(x_values))
plt.plot(x + bar_width, total, label='地区生产总值(亿元)', color='#E5323E',marker='.')
# 绘制第一个值的柱状图
plt.bar(x, value1, width=bar_width, label='第一产业增加值(亿元)', color='#5793F3',zorder=100)
# 绘制第二个值的柱状图
plt.bar(x + bar_width, value2, width=bar_width, label='第二产业增加值(亿元)', color='#87CEFA',zorder=100)
# 绘制第三个值的柱状图
plt.bar(x + 2 * bar_width, value3, width=bar_width, label='第三产业增加值(亿元)', color='#7164CC',zorder=100)
# 设置x轴标签
plt.xticks(x + bar_width,[int(x) for x in x_values],fontweight = 2)
# 设置y轴标签
plt.yticks(fontweight = 2)
# 添加标题和标签
plt.title('广东省地区生产总值')
plt.xlabel('年',fontweight = 3)
plt.ylabel('(单位:亿元)',fontweight = 3)
# 添加图例
plt.legend()
# 显示图形
plt.show()
由上图可知,随着年份的增加第一二三产业的增值都在增加,且2012年及以前第二产业增加值最大,2013年第三产业增值反超成为第一且差距逐渐拉开,年度地区生产总值也在不断增加,到了2020年可能受疫情等因素影响增加速率产生了明显降低。
矩形图通过高度反映不同分类数据之间的差距
3.条形图
数据来源:https://gddata.gd.gov.cn/opdata/index
导入为文件:17036489710452022年广东省各市旅游业收入情况.xls
通过查询广东省官方数据,获得2022年广东省各省市旅游业收入数据,将数据用条形图反映,其中颜色深浅表明数据的大小。
# 读取Excel文件数据
data = pd.read_excel('17036489710452022年广东省各市旅游业收入情况.xlsx')
y= list(data.iloc[9:30, 0])
x= list(data.iloc[9:30, 2])
# 只显示水平网格线
plt.gca().grid(True,alpha=0.8,linewidth=0.2,zorder=0)
# 确定颜色深浅
colors = np.array(x)
# 将数据归一化到[0, 1]范围
normalized_colors = (colors - np.min(colors)) / (np.max(colors) - np.min(colors))
# 绘制条形图
plt.barh(y, x,color=plt.cm.Blues(matplotlib.colors.Normalize(vmin=-0.2, vmax=0.5)(normalized_colors)))
# 添加标题和坐标轴标签
plt.title("2022年广东省各市旅游业收入情况")
plt.ylabel("城市")
plt.xlabel("总收入(单位:亿元)")
# 显示图形
plt.show()
图中可知,广州和深圳的收入位居一二名且远超其余城市,均超过1000亿元,第二梯队为东莞和佛山,其余城市更是低于200亿元。
条形图是横置的柱形图,能够更直接反映各城市间的差距
4.堆积图
数据来源:https://gddata.gd.gov.cn/opdata/index
导入为文件:17036492975892001-2022年广东省旅游业收入情况.xlsx
通过查询广东省官方数据,获得近20年广东省旅游业收入数据,将数据用堆积柱状图反映。
# 读取Excel文件数据
data = pd.read_excel('17036492975892001-2022年广东省旅游业收入情况.xlsx')
y1= list(data.iloc[9:30, 3])
y2= list(data.iloc[9:30, 5])
x= list(data.iloc[9:30,0])
# 创建图形
plt.figure(figsize=(8,4.5))
# 只显示水平网格线
plt.gca().yaxis.grid(True,alpha=0.8,linewidth=0.2,zorder=0)
# 绘制堆积图
plt.bar(range(len(y1)), y1, label='旅游外汇收入',color='skyblue')
plt.bar(range(len(y2)), y2, bottom=y1, label='国内旅游收入',color='coral')
# 添加标签和图例
plt.title('广东省近20年旅游业收入情况')
plt.xticks(range(len(y1)),x,rotation=45)
plt.xlabel('年',fontweight = 2)
plt.ylabel('(单位:亿元人名币)')
plt.legend()
# 显示图形
plt.show()
图中可以明显反映总收入的变化情况签17年逐渐增加,在2020年断崖式下降随后略有起伏,同时蓝色部分代表旅游外汇收入橙色部分代表国内旅游收入,两者变化情况与总体趋势一致,且国内旅游业占总体收入的主体。
堆积图可以反映每个部分的变化趋势和各个部分在主体中占的比重。
5.直方图
数据来源:https://gddata.gd.gov.cn/opdata/index
导入为文件:广东省各星级宾馆分布情况(旅游).xls
通过查询广东省官方数据,获得广东省各城市的星级酒店的分布情况及数据,将数据用直方图反映。
# 读取Excel文件数据
data = pd.read_excel('广东省各星级宾馆分布情况(旅游).xls')
y = list(data.iloc[5:26, 3])
# 只显示水平网格线
plt.gca().yaxis.grid(True,alpha=0.8,linewidth=0.2,zorder=0)
# 使用Matplotlib绘制直方图
plt.hist(y, bins=20, color='skyblue', edgecolor='black',zorder=100)
# 设置图表标题和标签
plt.title('广东省星级酒店分布情况')
plt.xlabel('星级酒店数量')
plt.ylabel('城市数量')
# 手动设置x轴刻度数量
plt.xticks(np.arange(0, 170, 10))
# 显示图表
plt.show()
由图可知,星级酒店为5-15的城市最多,达到7个城市,随着星级酒店数量多增加对应的城市数目减少,但是有1个城市有90余家星级酒店,1个城市有150余家星级酒店。
直方图用于反映数据的分布和波动情况
6.核密度估计图
数据来源:https://gddata.gd.gov.cn/opdata/index
导入为文件:广东省各星级宾馆分布情况(旅游).xls
本题沿用上一题数据,运用内置数学模型求出对应的概率密度函数,绘制核密度估计图。
# 读取Excel文件数据(来源:https://gddata.gd.gov.cn/opdata/index)
data = pd.read_excel('广东省各星级宾馆分布情况(旅游).xls')
y = list(data.iloc[5:26, 3])
# 使用seaborn绘制核密度估计图
sns.kdeplot(y, fill=True)
# 设置图表标题和标签
plt.title('广东省星级酒店分布情况')
plt.xlabel('星级酒店数量')
plt.ylabel('频率')
# 显示图表
plt.show()
图中可以看出星级酒店的数量为0-50的概率密度达到最大,并向两边减小。
7.箱形图
数据来源:https://gddata.gd.gov.cn/opdata/index
导入为文件:1640678477190粮油价格监测表----供"开放广东"平台发布(
2020年9月下半月至2021年12月上半月).xls
通过查询广东省官方数据,获得广东省粮油收购和销售的价格数据,运用粮油的零售价格绘制箱线图。
# 读取Excel文件数据(
data = pd.read_excel('1640678477190粮油价格监测表----供“开放广东”平台发布( 2020年9月下半月至2021年12月上半月).xls')
y1 = list(data.iloc[3, 4:])
y2 = list(data.iloc[4, 4:])
y3 = list(data.iloc[5, 4:])
y4 = list(data.iloc[6, 4:])
# 将数据组织成DataFrame
data = {'籼大米': y1, '小麦粉': y2}
df = pd.DataFrame(data)
data2 = {'花生油混合平均': y3, '大豆调和油': y4}
df2 = pd.DataFrame(data2)
fig, axes = plt.subplots(1, 2, figsize=(13, 6))
# 使用seaborn绘制箱线图
sns.boxplot(data=df,ax=axes[0])
# 设置图表标题和标签1
axes[0].set_title('广东省粮油价格零售价')
axes[0].set_ylabel('(单位:元/公斤)')
sns.boxplot(data=df2,ax=axes[1])
# 设置图表标题和标签2
axes[1].set_title('广东省粮油价格零售价')
axes[1].set_ylabel('(单位:元/升)')
# 显示图表
plt.show()
由图可以看出籼大米的总体价格比小麦粉贵,花生油混合平均比大豆调和油贵,且籼大米有异常数值有过异常低的一次价格,但是整体上价格起伏比小麦粉稳定,两种油的稳定情况相近。
箱线图中的5个量------最小值,下四分位数,中位数,上四分位数,最大值
8.饼图
数据来源:https://gddata.gd.gov.cn/opdata/index
导入为文件:2023年1-6月各市专利授权情况.xlsx
通过查询广东省官方数据,获得2023年1-6月广东省各市的专利授权数据,根据数据及其占比情况绘制饼图。
#数据
data = pd.read_excel('2023年1-6月各市专利授权情况.xlsx')
values = []
labels =[] # 每个部分的标签
other = 0
for i,j in zip(data.iloc[1:22,7],data.iloc[1:22,0]):
if i/sum(data.iloc[1:22,7])<=0.029:
other+=i
else:
values.append(i)
labels.append(j)
values.append(other)
labels.append('其他')
# 设置图形的颜色
colors = ['skyblue', 'lightcoral', 'lightgreen', 'lightpink', 'lightskyblue','coral','violet','khaki','darkgrey']
# 设置图形的大小
plt.figure(figsize=(5,5))
# 绘制饼图
plt.pie(values, labels=labels, colors=colors, startangle=90, autopct='%1.1f%%',textprops={'fontsize': 10,'color':'black'}, pctdistance=0.85)
# 添加图例
plt.legend(loc='center left', bbox_to_anchor=(1.3, 0.5))
# 添加标题
plt.title('广东省2023年1-6月各市专利授权情况(单位:件)')
# 显示图形
plt.show()
从图中可以看出深圳的专利授权全省第一占32.3%,其次是广东佛山东莞中山珠海惠州汕头,其余剩余城市的专利授权综合占全省的10.7%。
饼图用于显示数据中各项的大小与各项总和的比例
9.圆环图
本题沿用上一题数据,绘制圆环图。情况与上题几乎一直,仅展现形式略有不同。
#数据
data = pd.read_excel('2023年1-6月各市专利授权情况.xlsx')
values = []
labels =[] # 每个部分的标签
other = 0
for i,j in zip(data.iloc[1:22,7],data.iloc[1:22,0]):
if i/sum(data.iloc[1:22,7])<=0.029:
other+=i
else:
values.append(i)
labels.append(j)
values.append(other)
labels.append('其他')
#颜色设置
colors = ['skyblue', 'lightcoral', 'lightgreen', 'lightpink', 'lightskyblue','coral','violet','khaki','darkgrey']
# 绘制圆环图
plt.pie(values, labels=labels, autopct='%1.1f%%', startangle=90, colors=colors,wedgeprops=dict(width=0.4))
# 设置图表标题
plt.title('广东省2023年1-6月各市专利授权情况(单位:件)')
# 显示图表
plt.show()
10.散点图
数据来源:#数据(来源:https://echarts.apache.org/examples/zh/editor.html?c=scatter-weight
导入为文件:data9.xlsx
通过相关渠道,得到若干广东男生和女生的身高体重信息,将其放入同一个坐标系中绘制散点图。
#数据
data=pd.read_excel('data9.xlsx')
# 定义数据
xmale = data.iloc[0:,0]
ymale = data.iloc[0:,1]
xfemale = data.iloc[0:,2]
yfemale = data.iloc[0:,3]
# 显示网格线
plt.gca().grid(True,alpha=0.8,linewidth=0.2,zorder=0)
# 绘制散点图
plt.scatter(xmale, ymale,s=25,c='#5470c6',label='male')
plt.scatter(xfemale, yfemale,c='#91cc75',alpha=0.8,s=25,label='female')
# 添加标题和标签
plt.title('身高与体重')
plt.xlabel('身高(单位:厘米)')
plt.ylabel('体重(单位:千克)')
plt.legend()
# 显示图形
plt.show()
由图可知,无论男女生身高和体重总体上呈现正比关系,且女生身高体重都略小于男生。
散点图用于判断两变量之间是否存在某种关联
11.气泡图
数据来源:https://new.qq.com/rain/a/20230206A06TVB00
导入为文件:data10.xlsx
通过相关渠道,获得2022年广东省各城市总GPD,人均GDP,常住人口数量等信息,将总GDP,人均GDP作为变量建立二维坐标系,而气泡面积则反映常住人口数量。
#数据(来源:
data=pd.read_excel('data10.xlsx')
# 定义数据
label=list(data.iloc[2,1:])
x = list(data.iloc[3,1:])#总GDP
y = list(data.iloc[9,1:])#人均GDP
size=list(data.iloc[8,1:])#常住人口
# 创建图形
plt.figure(figsize=(7,4.5))
# 只显示水平网格线
plt.gca().yaxis.grid(True,alpha=0.8,linewidth=0.2,zorder=0)
# 绘制气泡图
plt.scatter(x, y, s=size, alpha=0.5)
# 设置图表标题和标签
plt.title('GDP与常驻人口')
plt.xlabel('2022总GDP(亿元)')
plt.ylabel('人均GDP(元)')
# 在每个气泡的中心位置添加文字标签
for i, label in enumerate(labels):
plt.text(x[i], y[i], label, ha='center', va='center', fontsize=8)
# 显示图表
plt.show()
由图可知,无论是总GDP还是人均GDP深圳和广州均遥遥领先,其次是佛山东莞,他们的常住人口数量也是全省前四,但是珠海是个特殊城市,其总GDP在省内排名不高但是人口少,从而导致人均GDP比较高。
气泡图能够展示多变量关系
12.差棒图
数据来源:https://gddata.gd.gov.cn/opdata/index
导入为文件:data=pd.read_excel('1689750889458广州市各月平均温度和湿度信息.xlsx
通过广东省官方数据,我们获取了广州市各月的平均气温以及广州市内各区的平均气温,我们选择番禺区的测量数值惊醒研究绘制差棒图。
#数据(来源:https://gddata.gd.gov.cn/opdata/index)
data=pd.read_excel('1689750889458广州市各月平均温度和湿度信息.xlsx')
# 定义数据
x =list([i for i in range(1, 12 + 1)])#月份
y1 =list(data.iloc[0:12,3])#全市温度
y = list(data.iloc[12:24,3])#番禺站测量温度
error=[]#误差
for i,j in zip(y1,y):
error.append(j-i)
# 只显示水平网格线
plt.gca().yaxis.grid(True,alpha=0.8,linewidth=0.2,zorder=0)
# 绘制连续的误差棒图
plt.plot(x, y, marker='o', linestyle='-', color='skyblue')
plt.errorbar(x, y, yerr=error, fmt='none', ecolor='tomato', elinewidth=2, capsize=5)
# 设置图表标题和标签
plt.title('广州市各月平均气温')
plt.xlabel('月份')
plt.ylabel('平均温度(摄氏度)')
# 手动设置x轴刻度数量
plt.xticks(np.arange(1, 13, 1))
# 显示图表
plt.show()
由图可知,广州市的全年温度大概分布在15-30摄氏度,且呈现先涨后降的趋势,越秀的温度测量在夏季时想校跟为合理,冬季会产生稍大误差。
误差棒图表示测量数据中客观存在的测量偏差
13.雷达图
由于专业评分数据较多,本题选择了华北电力大学6个专业及其相关的星级评分进行雷达图的绘制。
# 数据
categories = ['电气工程及其自动化','应用物理学', '能源与动力工程', '信息与计算科学', '英语','机械电子工程','电气工程及其自动化']
values = [6, 4, 5, 4, 3,3,6]
# 绘制雷达图
fig, ax = plt.subplots(figsize=(4, 4), subplot_kw=dict(polar=True))
ax.fill_between(np.linspace(0, 2 * np.pi, len(values)), values, alpha=0.3)
# 设置雷达图的标签
ax.set_xticks(np.linspace(0, 2 * np.pi, len(categories)))
ax.set_xticklabels(categories,fontweight=8)
# 设置图表标题
plt.title('华电各专业评级',pad=20)
# 显示图表
plt.show()
由图可知,华北电力大学的电气工程及其自动化评分最好,其余都未达到较高分值,但是总体各专业评分都无大的缺点。
雷达图表现多维(四维以上)数据