大数据可视化技术

实验九:数据可视化中的交互

一、实验名称 

数据可视化中的交互

二、实验目的

通过该实验的实践,要求学生可以理解可视化交互的概念,掌握Matplotlib和pyecharts的使用过程,能够熟练绘制图表中的可视化交互元素。

三、实验原理

可视化中的交互,可以缓解有限的可视化空间与数据量过载之间的矛盾

可视化中优秀的交互设计,可以让用户更好的理解和分析数据

掌握常见的可视化交互方式,如选择、过滤、溯源等

四、实验步骤

1 2018年北京AQI全年走势图

输入以下代码:

import pandas as pd
from pyecharts import Line
#读取数据
df = pd.read_csv('/home/ubuntu/beijing_AQI_2018.csv')
attr = df['Date']#取Date的值
v1 = df['AQI']#取AQI的值
line = Line("2018年北京AQI全年走势图", title_pos='center', title_top='18', width=800, height=400)#设置宽高、标题的位置,字体
#添加AQI线,设置点线的形状和颜色
line.add("AQI值:", attr, v1, mark_line=['average'], is_fill=True, area_color="#000", area_opacity=0.3, mark_point=["max", "min"], mark_point_symbol="circle", mark_point_symbolsize=25)
line.render("./2018年北京AQI全年走势图.html")#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_ci

2 2018年北京PM2.5全年走势图

输入以下代码:

import pandas as pd
from pyecharts import Line
#读取数据
df = pd.read_csv('/home/ubuntu/beijing_AQI_2018.csv')
attr = df['Date']#取Date的值
v1 = df['PM']#取Pm的值
line = Line("2018年北京PM2.5全年走势图", title_pos='center', title_top='18', width=800, height=400)#设置宽高、标题的位置,字体
#添加PM2.5值线,设置点线的形状和颜色
line.add("PM2.5值:", attr, v1, mark_line=['average'], is_fill=True, area_color="#000", area_opacity=0.3, mark_point=["max", "min"], mark_point_symbol="circle", mark_point_symbolsize=25)
line.render("./2018年北京PM2.5全年走势图.html")#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_大数据_02

3 2018年北京月均AQI走势图

输入以下代码:

import numpy as np
import pandas as pd
from pyecharts import Line
#读取数据
df = pd.read_csv('/home/ubuntu/beijing_AQI_2018.csv')
dom = df[['Date', 'AQI']]#取Date和AQI的值
list1 = []
#取出月份
for j in dom['Date']:
    time = j.split('/')[1]
    list1.append(time)
df['month'] = list1

month_message = df.groupby(['month'])#根据月份分组
month_com = month_message['AQI'].agg(['mean'])#求AQi的平均值
month_com.reset_index(inplace=True)#重设索引
month_com_last = month_com.sort_index()#索引排序

attr = ["{}".format(str(i) + '月') for i in range(1, 13)]#月份数据
v1 = np.array(month_com_last['mean'])#取每月的均值
v1 = ["{}".format(int(i)) for i in v1]

line = Line("2018年北京月均AQI走势图", title_pos='center', title_top='18', width=800, height=400)
#添加AQI月均值线,设置点线的形状和颜色
line.add("AQI月均值", attr, v1, mark_point=["max", "min"])
line.render("./2018年北京月均AQI走势图.html")#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_html_03

4 2018年北京月均PM2.5走势图

输入以下代码:

import numpy as np
import pandas as pd
from pyecharts import Line
#读取数据
df = pd.read_csv('/home/ubuntu/beijing_AQI_2018.csv')

dom = df[['Date', 'PM']]#取Date和PM的值
list1 = []
#取出月份
for j in dom['Date']:
    time = j.split('/')[1]
    list1.append(time)
df['month'] = list1

month_message = df.groupby(['month'])#根据月份分组
month_com = month_message['PM'].agg(['mean'])#求PM的平均值
month_com.reset_index(inplace=True)#重设索引
month_com_last = month_com.sort_index()#索引排序

attr = ["{}".format(str(i) + '月') for i in range(1, 13)]
v1 = np.array(month_com_last['mean'])
v1 = ["{}".format(int(i)) for i in v1]

line = Line("2018年北京月均PM2.5走势图", title_pos='center', title_top='18', width=800, height=400)
#添加PM2.5,设置点线的形状和颜色
line.add("", attr, v1, mark_point=["max", "min"])
line.render("./2018年北京月均PM2.5走势图.html")#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_html_04

5 2018年北京季度AQI箱形图

输入以下代码:

import pandas as pd
from pyecharts import Boxplot
#读取数据
df = pd.read_csv('/home/ubuntu/beijing_AQI_2018.csv')
#取Date和AQI的值
dom = df[['Date', 'AQI']]
data = [[], [], [], []]
dom1, dom2, dom3, dom4 = data
#取'第一季度', '第二季度', '第三季度', '第四季度'的AQI
for i, j in zip(dom['Date'], dom['AQI']):
    time = i.split('/')[1]
    if time in ['1', '2', '3']:
        dom1.append(j)
    elif time in ['4', '5', '6']:
        dom2.append(j)
    elif time in ['7', '8', '9']:
        dom3.append(j)
    else:
        dom4.append(j)

boxplot = Boxplot("2018年北京季度AQI箱形图", title_pos='center', title_top='18', width=800, height=400)#设置宽高、标题的位置,字体
x_axis = ['第一季度', '第二季度', '第三季度', '第四季度']#设置x轴的值
y_axis = [dom1, dom2, dom3, dom4]#第一个y轴的值
_yaxis = boxplot.prepare_data(y_axis)#第二个y轴的值
boxplot.add("", x_axis, _yaxis)
boxplot.render("./2018年北京季度AQI箱形图.html")#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_ci_05

6 2018年北京季度PM2.5箱形图

输入以下代码:

import pandas as pd
from pyecharts import Boxplot
#读取数据
df = pd.read_csv('/home/ubuntu/beijing_AQI_2018.csv')
#取Date和PM的值
dom = df[['Date', 'PM']]
data = [[], [], [], []]
#取'第一季度', '第二季度', '第三季度', '第四季度'的PM
dom1, dom2, dom3, dom4 = data
for i, j in zip(dom['Date'], dom['PM']):
    time = i.split('/')[1]
    if time in ['1', '2', '3']:
        dom1.append(j)
    elif time in ['4', '5', '6']:
        dom2.append(j)
    elif time in ['7', '8', '9']:
        dom3.append(j)
    else:
        dom4.append(j)

boxplot = Boxplot("2018年北京季度PM2.5箱形图", title_pos='center', title_top='18', width=800, height=400)#设置宽高、标题的位置,字体
x_axis = ['第一季度', '第二季度', '第三季度', '第四季度']#设置x轴的值
y_axis = [dom1, dom2, dom3, dom4]#第一个y轴的值
_yaxis = boxplot.prepare_data(y_axis)#第二个y轴的值
boxplot.add("", x_axis, _yaxis)
boxplot.render("./2018年北京季度PM2.5箱形图.html")#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_数据可视化_06

7 2018年北京全年空气质量情况

输入以下代码:

import pandas as pd
from pyecharts import Pie
#读取数据
df = pd.read_csv('/home/ubuntu/beijing_AQI_2018.csv')
#根据Quality_grade分组
rank_message = df.groupby(['Quality_grade'])
#同级Quality_grade分组的频数
rank_com = rank_message['Quality_grade'].agg(['count'])
rank_com.reset_index(inplace=True)#重置索引
rank_com_last = rank_com.sort_values('count', ascending=False) #从大到小排序

attr = rank_com_last['Quality_grade'] #取Quality_grade从大到小排序的值
v1 = rank_com_last['count']

pie = Pie("2018年北京全年空气质量情况", title_pos='center', title_top=0) #设置标题的位置
pie.add("", attr, v1, radius=[40, 75], label_text_color=None, is_label_show=True, legend_orient="vertical", legend_pos="left", legend_top="%10")
pie.render('./2018年北京全年空气质量情况.html') #生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_大数据_07

8 2018年北京PM2.5指数日历图

输入以下代码:

import datetime
import random
import numpy as np
import pandas as pd
from pyecharts import HeatMap
#读取数据beijing_AQI_2018.csv
df = pd.read_csv('/home/ubuntu/beijing_AQI_2018.csv')
#v1 = ["{}".format(int(i)) for i in np.array(df['PM'])]#将PM值转成整数

#begin = datetime.date(2018, 1, 1)
#end = datetime.date(2018, 12, 31)

#data = [[str(begin + datetime.timedelta(days=i)), v1[i]] for i in range((end - begin).days + 1)]
#random.randint(1000, 25000)
#data = [[str(begin + datetime.timedelta(days=i)), random.randint(0, 400)] for i in range((end - begin).days + 1)]
dom = df[['Date', 'PM']]#取日期和PM
list1 = []
#将日期和PM压缩后字典后遍历
for i, j in zip(dom['Date'], dom['PM']):
    time_list = i.split('/')
    #将Date转换成datatime类型
    time = datetime.date(int(time_list[0]),int(time_list[1]),int(time_list[2]))
    PM = int(j)#PM值取整
    list1.append([str(time),str(PM)])
#创建热力图,设置宽高、标题的位置
heatmap = HeatMap("2018年北京PM2.5指数日历图", title_pos='40%', title_top='10', width=800, height=400)
heatmap.add(
    "",
    list1,
    is_calendar_heatmap=True,#是日历天
    visual_text_color="#000",
    visual_range_text=["", ""],
    visual_range=[0, 300],#可视范围
    calendar_cell_size=["auto", 30],#日期格子的大小
    is_visualmap=True,#采用visualmap透视
    calendar_date_range="2018",#日期范围是2018年内
    visual_orient="horizontal",#水平
    visual_pos="26%",#位置
    visual_top="70%",#顶部位置
    is_piecewise=True,#显示精确度
    visual_split_number=6#对于连续型数据,自动平均切分成几段
)
heatmap.render('./2018年北京PM2.5指数日历图.html')#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_html_08

9 2018年北上广深AQI全年走势图

输入以下代码:

import numpy as np
import pandas as pd
from pyecharts import Line

citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
cityes_AQI = []
for i in range(4):
    filename = '/home/ubuntu/'+ citys[i] + '_AQI' + '_2018.csv' # 文件内容:"日期","质量等级","AQI指数","当天AQI排名","PM2.5"
    aqi_data = pd.read_csv(filename)

    get_data = aqi_data[['Date', 'AQI']] # 提取 "日期","AQI指数"两列内容进行分析
    month_for_data = []
    for j in get_data['Date']:
        time = j.split('/')[1]
        month_for_data.append(time)
    aqi_data['Month'] = month_for_data # 获取每行数据的月份

    # 求每个月AQI平均值
    month_data = aqi_data.groupby(['Month'])
    month_AQI = month_data['AQI'].agg(['mean'])
    month_AQI.reset_index(inplace=True)
    month_AQI_average = month_AQI.sort_index()

    # 获取每个城市月均AQI的数据,转化为int数据类型
    month_AQI_data = np.array(month_AQI_average['mean'])
    month_AQI_data_int = ["{}".format(int(i)) for i in month_AQI_data]
    cityes_AQI.append(month_AQI_data_int)

months = ["{}".format(str(i) + '月') for i in range(1, 13)]

line = Line("2018年北上广深AQI全年走势图", title_pos='center', title_top='0', width=800, height=400)
line.add("北京", months, cityes_AQI[0], line_color='red', legend_top='8%')
line.add("上海", months, cityes_AQI[1], line_color='purple', legend_top='8%')
line.add("广州", months, cityes_AQI[2], line_color='blue', legend_top='8%')
line.add("深圳", months, cityes_AQI[3], line_color='orange', legend_top='8%')
line.render('./2018年北上广深AQI全年走势图.html')#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_中国大学数据分析及可视化实验报告_09

10 2018年北上广深PM2.5全年走势图

输入以下代码:

import numpy as np
import pandas as pd
from pyecharts import Line

citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
cityes_PM = []
for i in range(4):
    filename ='/home/ubuntu/'+  citys[i] + '_AQI' + '_2018.csv'  # 文件内容:"日期","质量等级","AQI指数","当天AQI排名","PM2.5"
    aqi_data = pd.read_csv(filename)

    get_data = aqi_data[['Date', 'PM']] # 提取 "日期","PM2.5"两列内容进行分析
    month_for_data = []
    for j in get_data['Date']:
        time = j.split('/')[1]
        month_for_data.append(time)
    aqi_data['Month'] = month_for_data # 获取每行数据的月份

    # 求每个月PM2.5平均值
    month_data = aqi_data.groupby(['Month'])
    month_PM = month_data['PM'].agg(['mean'])
    month_PM.reset_index(inplace=True)
    month_PM_average = month_PM.sort_index()

    # 获取每个城市每个月AQI的数据,转化为int数据类型
    month_PM_data = np.array(month_PM_average['mean'])
    month_PM_data_int = ["{}".format(int(i)) for i in month_PM_data]
    cityes_PM.append(month_PM_data_int)

months = ["{}".format(str(i) + '月') for i in range(1, 13)]

line = Line("2018年北上广深PM2.5全年走势图", title_pos='center', title_top='0', width=800, height=400)
line.add("北京", months, cityes_PM[0], line_color='red', legend_top='8%')
line.add("上海", months, cityes_PM[1], line_color='purple', legend_top='8%')
line.add("广州", months, cityes_PM[2], line_color='blue', legend_top='8%')
line.add("深圳", months, cityes_PM[3], line_color='orange', legend_top='8%')
line.render('./2018年北上广深PM2.5全年走势图.html')#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_大数据_10

11 2018年北上广深全年空气质量情况

输入以下代码:

import numpy as np
import pandas as pd
from pyecharts import Pie, Grid

citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
v = []
attrs = []
for i in range(4):
    filename = '/home/ubuntu/'+ citys[i] + '_AQI' + '_2018.csv'# 文件内容:"日期","质量等级","AQI指数","当天AQI排名","PM2.5"
    df = pd.read_csv(filename) #pd.read_csv(filename, header=None, names=["Date", "Quality_grade", "AQI", "AQI_rank", "PM"])
	#根据Quality_grade分组
    Quality_grade_message = df.groupby(['Quality_grade'])
    #每组的频数
    Quality_grade_com = Quality_grade_message['Quality_grade'].agg(['count'])
    Quality_grade_com.reset_index(inplace=True)#重置索引
    Quality_grade_com_last = Quality_grade_com.sort_values('count', ascending=False)#从大到小排序
	#取Quality_grade的值
    Quality_grade_array = Quality_grade_com_last['Quality_grade']
    Quality_grade_array = np.array(Quality_grade_com_last['Quality_grade'])
    attrs.append(Quality_grade_array)
    Quality_grade_count = Quality_grade_com_last['count']
    Quality_grade_count = np.array(Quality_grade_com_last['count'])
    v.append(Quality_grade_count)

pie1 = Pie("北京", title_pos="28%", title_top="24%")#创建饼图,设置位置
pie1.add("", attrs[0], v[0], radius=[20, 40], center=[30, 27], legend_pos="63%", legend_top="40%", legend_orient="vertical",is_label_show=True)#添加数据,设置图例的属性,显示标签

pie2 = Pie("上海", title_pos="52%", title_top="24%")#创建饼图,设置位置
pie2.add("", attrs[1], v[1], radius=[20, 40], center=[54, 27], is_label_show=False, is_legend_show=False)
#添加数据,设置图例的属性,显示标签
pie3 = Pie("广州", title_pos='28%', title_top='77%')#创建饼图,设置位置
pie3.add("", attrs[2], v[2], radius=[20, 40], center=[30, 80], is_label_show=False, is_legend_show=False)
#添加数据,设置图例的属性,显示标签
pie4 = Pie("深圳", title_pos='52%', title_top='77%')#创建饼图,设置位置
pie4.add("", attrs[3], v[3], radius=[20, 40], center=[54, 80], is_label_show=False, is_legend_show=False)
#添加数据,设置图例的属性,显示标签
grid = Grid("2018年北上广深全年空气质量情况", width=1200)
grid.add(pie1)
grid.add(pie2)
grid.add(pie3)
grid.add(pie4)
grid.render('./2018年北上广深全年空气质量情况.html')#生成html,在该python文件同级目录下

输出结果:

中国大学数据分析及可视化实验报告_ci_11

五、实验总结

在实验中,通过实践练习,提高学生使用Matplotlib和pyecharts进行数据可视化交互的熟练程度,总结常见的交互方式,让用户更好的理解和分析数据。