数据可视化基础案例练习一
- 概述
- 案例
- 1. 绘制 2000-2017 年各季度的国民生产总值散点图
- 2. 绘制 2000-2017 年第一产业、第二产业、第三产业各季度的国民生产总值 散点图
- 3. 绘制 2000-2017 年各产业第一季度季度生产总值折线图
- 4. 绘制 2000-2017 年各产业各季度生产总值点线图
- 5. 绘制 2000 年与 2016 年产业结构饼图
- 6. 使用生成服从标准正态分布的数据绘制直方图
- 7. 绘制 2017 年第一季度各产业国民生产总值条形图
- 8. 绘制国民生产总值分散情况箱线图
- 9. 分析1996-2015年人口数据特征间的关系
- 10. 分析1996-2015年人口数据各个特征的分布与分散状况
- 11. 实现scatterplot关系图
概述
使用到的Python库
- Matplotlib
- Seaborn
- Numpy
使用到的数据集
网盘链接:
提取码:
- 1345
案例
1. 绘制 2000-2017 年各季度的国民生产总值散点图
代码
import matplotlib.pyplot as plt
import numpy as np
data = np.load('./国民经济核算季度数据.npz',allow_pickle = True)
name = data['columns']
values = data['values']
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (8, 7))
plt.scatter(values[: ,0], values[: , 2], marker = 'o')
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation = 45)
plt.title('2000-2017年季度生产总值散点图')
plt.savefig('./2000-2017年季度生产总值散点图.png')
plt.show()
结果
2. 绘制 2000-2017 年第一产业、第二产业、第三产业各季度的国民生产总值 散点图
代码
plt.Figure(dpi = 80, figsize = (8, 7))
plt.rcParams['font.sans-serif'] = 'SimHei'
y1 = values[: , 3]
plt.scatter(range(len(y1)), y1)
plt.xticks(range(len(y1)), values[: : 4, 1], rotation = 45)
y2 = values[: , 4]
plt.scatter(range(len(y2)), y2)
plt.xticks(range(len(y2)), values[: : 4, 1], rotation = 45)
y3 = values[: , 5]
plt.scatter(range(len(y3)), y3)
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation = 45)
plt.title('2010-2017各产业季度生产总值')
plt.legend(['第一产业', '第二产业', '第三产业'])
plt.savefig('./三种产业散点图.png')
plt.show()
结果
3. 绘制 2000-2017 年各产业第一季度季度生产总值折线图
代码
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.figure(dpi = 80, figsize = (8, 8))
y1 = values[: : 4, 3]
y2 = values[: : 4, 4]
y3 = values[: : 4, 5]
plt.plot(range(len(y1)), y1, linestyle = '-.')
plt.plot(range(len(y2)), y2, linestyle = '--')
plt.plot(range(len(y3)), y3)
plt.xticks(range(len(y3)), values[: : 4, 1], rotation = 45)
plt.title('2000-2017各产业第一季度折线图')
plt.legend(['第一产业', '第二产业', '第三产业'])
plt.savefig('./各产业第一季度折线图.png')
plt.show()
结果
4. 绘制 2000-2017 年各产业各季度生产总值点线图
代码
plt.figure(figsize = (8, 7))
plt.plot(values[: , 0], values[: , 3], 'b-',values[: , 0], values[: , 4], 'y-.',values[: , 0], values[: , 5], 'g--')
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation = 45)
plt.title('2000-2017年各产业季度生产总值折线图')
plt.legend(['第一产业', '第二产业', '第三产业'])
plt.savefig('./2000-2017年季度各产业生产总值折线图.png')
plt.show()
结果
5. 绘制 2000 年与 2016 年产业结构饼图
代码
name = data['columns']
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
pic = plt.figure(dpi = 100, figsize = (8, 4))
plt.rcParams['font.sans-serif'] = 'SimHei'
a_labs = [i[: 4] for i in name[3: 6]]
b_labs = [i[: 2] for i in name[6:]]
explode = [0.01, 0.01, 0.01]
pic.add_subplot(1, 2, 1)
plt.pie(np.sum(values[: 4, 3: 6],axis = 0), autopct = '%1.1f%%',
labels = a_labs, explode = explode)
plt.title('2000年产业结构')
pic.add_subplot(1, 2, 2)
plt.pie(np.sum(values[-2: -6: -1, 3: 6], axis = 0), autopct = '%1.1f%%',
labels = a_labs, explode = explode)
plt.title('2016年产业结构')
plt.savefig('./2000到2016产业结构变化饼图.png')
plt.show()
结果
6. 使用生成服从标准正态分布的数据绘制直方图
代码
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), dpi = 100)
mu = 0
sigma = 1
x = np.random.normal(mu, sigma, 10000)
plt.hist(x, bins = 20, density = True, rwidth = 0.96)
plt.title('标准正态分布数据直方图')
plt.savefig('./标准正态分布数据直方图.png')
plt.show()
结果
7. 绘制 2017 年第一季度各产业国民生产总值条形图
代码
data = np.load('./国民经济核算季度数据.npz',allow_pickle = True)
values = data['values']
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
x = range(3)
my_height = np.sum(values[-2: -6: -1, 3: 6], axis = 0)
plt.figure(figsize = (8, 8), dpi = 100)
plt.bar(x, my_height, width=0.8)
for i in range(len(my_height)):
plt.text(i,my_height[i],'{}亿元'.format(my_height[i]),va = 'bottom',ha = 'center')
plt.xticks(x, ['第一产业', '第二产业', '第三产业'])
plt.ylim([0, 500000])
plt.title('2016年各产业国民生产总值条形图')
plt.savefig('./2016年各产业国民生产总值条形图.png')
plt.show()
结果
8. 绘制国民生产总值分散情况箱线图
代码
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
pic = plt.figure(dpi = 200, figsize = (8, 8))
plt.rcParams['font.sans-serif'] = 'SimHei'
a_labs = [i[: 4] for i in name[3: 6]]
b_labs = [i[: 2] for i in name[6: ]]
pic.add_subplot(2, 1, 1)
plt.boxplot([list(values[: , 3]), list(values[: , 4]),list(values[: , 5])], notch = True, meanline = True)
plt.xticks(range(1, 4), a_labs)
plt.title('2000-2017年各产业国民生产总值箱线图')
pic.add_subplot(2, 1, 2)
tem = []
for i in range(6, len(values[0])):
tem.append(list(values[: , i]))
plt.boxplot(tem, notch = True, meanline = True)
plt.xticks(range(1, len(b_labs) + 1), b_labs)
plt.title('2000-2017年各行业国民生产总值箱线图')
plt.show()
结果
9. 分析1996-2015年人口数据特征间的关系
代码
import numpy as np
import matplotlib.pyplot as plt
data=np.load('./populations.npz',allow_pickle=True)
print(data.files)
print(data['data'])
print(data['feature_names'])
plt.rcParams['font.sans-serif']='SimHei'
name=data['feature_names']
values=data['data']
p1=plt.figure(figsize=(12,12))# 确定画布大小
pip1=p1.add_subplot(2,1,1)# 创建一个两行一列的子图并开始绘制
plt.scatter(values[0:20,0],values[0:20,1],marker='8',color='red')
plt.ylabel('总人口(万人)')
plt.legend('年末')
plt.title('1996~2015年末与各类人口散点图')
pip2=p1.add_subplot(2,1,2)
plt.scatter(values[0:20,0],values[0:20,2],marker='o',color='yellow')
plt.scatter(values[0:20,0],values[0:20,3],marker='D',color='green')
plt.scatter(values[0:20,0],values[0:20,4],marker='p',color='blue')
plt.scatter(values[0:20,0],values[0:20,5],marker='s',color='purple')
plt.xlabel('时间')
plt.ylabel('总人口(万人)')
plt.xticks(values[0:20,0])
plt.legend(['男性','女性','城镇','乡村'])
# 在子图上绘制折线图
p2=plt.figure(figsize=(12,12))
p1=p2.add_subplot(2,1,1)
plt.plot(values[0:20,0],values[0:20,1],color='r',linestyle='--',marker='8')
plt.ylabel('总人口(万人)')
plt.xticks(range(0,20,1),values[range(0,20,1),0],rotation=45)
plt.legend('年末')
plt.title('1996~2015年末总与各类人口折线图')
p2=p2.add_subplot(2,1,2)
plt.plot(values[0:20,0],values[0:20,2],'y-')
plt.plot(values[0:20,0],values[0:20,3],'g-.')
plt.plot(values[0:20,0],values[0:20,4],'b-')
plt.plot(values[0:20,0],values[0:20,5],'p-')
plt.xlabel('时间')
plt.ylabel('总人口(万人)')
plt.xticks(values[0:20,0])
plt.legend(['男性','女性','城镇','乡村'])
# 显示图片
plt.show()
结果
10. 分析1996-2015年人口数据各个特征的分布与分散状况
代码
import numpy as np
import matplotlib.pyplot as plt
data=np.load('./populations.npz',allow_pickle=True)
print(data.files)
print(data['data'])
print(data['feature_names'])
plt.rcParams['font.sans-serif']='SimHei'
name=data['feature_names']
values=data['data']
label1=['男性','女性']
label2=['城镇','乡村']
ex=[0.01,0.01]
p1=plt.figure(figsize=(12,12))
a1=p1.add_subplot(2,2,1)
plt.bar(range(2),values[19,2:4],width=0.5,color='orange')
plt.ylabel('人口(万人)')
plt.ylim(0,80000)
plt.xticks(range(2),label1)
plt.title('1996年男、女人口数直方图')
# 子图 2
b1=p1.add_subplot(2,2,2)
plt.bar(range(2),values[0,2:4],width=0.5,color='red')
plt.ylabel('人口(万人)')
plt.ylim(0,80000)
plt.xticks(range(2),label1)
plt.title('2015年男、女人口数直方图')
c1=p1.add_subplot(2,2,3)
plt.bar(range(2),values[19,4:6],width=0.5,color='orange')
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.ylim(0,90000)
plt.xticks(range(2),label2)
plt.title('1996年城、乡人口数直方图')
d1=p1.add_subplot(2,2,4)
plt.bar(range(2),values[0,4:6],width=0.5,color='red')
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.ylim(0,90000)
plt.xticks(range(2),label2)
plt.title('2015年城、乡人口数直方图')
p2=plt.figure(figsize=(8,8))
a2=p2.add_subplot(2,2,1)
plt.pie(values[19,2:4],explode=ex,labels=label1,colors=['pink','crimson'],autopct='%1.1f%%')
plt.title('1996年男、女人口数饼图')
b2=p2.add_subplot(2,2,2)
plt.pie(values[0,2:4],explode=ex,labels=label1,colors=['PeachPuff','skyblue'],autopct='%1.1f%%')
plt.title('2015年男、女人口数饼图')
c2=p2.add_subplot(2,2,3)
plt.pie(values[19,4:6],explode=ex,labels=label2,colors=['pink','crimson'],autopct='%1.1f%%')
plt.title('1996年城、乡人口数饼图')
d2=p2.add_subplot(2,2,4)
plt.pie(values[0,4:6],explode=ex,labels=label2,colors=['PeachPuff','skyblue'],autopct='%1.1f%%')
plt.title('2015年城、乡人口数饼图')
p3=plt.figure(figsize=(10,10))
plt.boxplot(values[0:20,1:6],notch=True,labels=['年末','男性','女性','城镇','乡村'],meanline=True)
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.title('1996~2015年各特征人口箱线图')
plt.show()
部分结果
11. 实现scatterplot关系图
使用 tips 数据集绘制一个简单的散点图
代码
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
ax = sns.scatterplot(x='total_bill', y='tip', data=tips)
ax.set_title('总账单与小费散点图')
结果
通过添加第三个变量分类变量,对点着色(故称色调语义)和改变标记标记来显示分组变量,以突显每个类别。
代码
sns.scatterplot(x="total_bill", y="tip", hue="time", style="time", data=tips)
结果
通过改变点的大小并添加连续颜色来显示定量类别变量。
代码
cmap = sns.cubehelix_palette(8, start=1, rot=0, as_cmap=True)
sns.scatterplot(x="total_bill", y="tip", size="size", data=tips, hue='size', palette=cmap)
结果
使用自定义的分组点标记使用自定义的分组点标记。
代码
markers = {"Lunch": "o", "Dinner": "X"}
sns.scatterplot(x="total_bill", y="tip", style="time", hue='time', markers=markers, data=tips, palette='Set2')
结果
向 scatterplot 函数中传入 matplotlib 参数控制绘图元素。
代码
sns.scatterplot(x='total_bill', y='tip', data=tips, color='r', markers='')
plt.title('总账单和小费散点图')
结果
本篇文章到这里就结束了,如发现错误或有任何疑问请直接指出