《数据可视化技术》上机报告

一、实验目的及要求

掌握pyecharts数据可视化环境搭建以及pyecharts交互式基础图形的绘制。

(1)掌握pyecharts中初始配置项,系列配置项,全局配置项的配置方法。

(2)掌握pyecharts中条形图的绘制方法。

(3)掌握pyecharts中散点图的绘制方法。

(4)掌握pyecharts中折线图的绘制方法。

(5)掌握pyecharts中箱线图的绘制方法。

(6)掌握pyecharts中3D散点图的绘制方法。

(7)掌握pyecharts中饼图的绘制方法。


第一题

利用pyecharts绘制商家A和商家B销售的条形图,数据:商家A和商家B的各类商品的销售数据.xlsx。要求:要有初始配置项,系列配置项和全局配置项的各种配置,包括:画布宽度,高度,主题风格,添加主标题,标签位置向右,条形图方向为横向,有动画效果,并添加平均值标记线。

|-----|-----|-----|-----|-----|-----|-----|-----|
| 商家 | 衬衫 | 毛衣 | 领带 | 裤子 | 风衣 | 高跟鞋 | 袜子 |
| 商家A | 120 | 56 | 28 | 98 | 129 | 28 | 107 |
| 商家B | 60 | 140 | 153 | 145 | 160 | 70 | 54 |

python 复制代码
from pyecharts import options as opts
from pyecharts.charts import Bar
import pandas as pd
from pyecharts.globals import ThemeType

# 读取数据
df = pd.read_excel('商家A和商家B的各类商品的销售数据.xlsx', index_col='商家')

# 计算平均值
average_value = df.mean().mean()  # 计算所有商品销售量的平均值

# 创建横向条形图
bar = (
    Bar(init_opts=opts.InitOpts(width='1000px', height='600px', theme=ThemeType.LIGHT))
    .add_xaxis(df.columns.tolist())  # 设置X轴为商品类型
    .add_yaxis('商家A', df.loc['商家A'].tolist(),
               label_opts=opts.LabelOpts(position='right'),  # 标签显示在右侧
               itemstyle_opts=opts.ItemStyleOpts(color="#C1232B"),
               markline_opts=opts.MarkLineOpts(
                   data=[opts.MarkLineItem(type_="average", name="商家A平均值")]
               ))
    .add_yaxis('商家B', df.loc['商家B'].tolist(),
               label_opts=opts.LabelOpts(position='right'),  # 标签显示在右侧
               itemstyle_opts=opts.ItemStyleOpts(color="#2F4554"),
               markline_opts=opts.MarkLineOpts(
                   data=[opts.MarkLineItem(type_="average", name="商家B平均值")]
               ))
    .reversal_axis()  # 设置条形图方向为横向
    .set_global_opts(
        title_opts=opts.TitleOpts(title='商家A和商家B销售的条形图'),
        xaxis_opts=opts.AxisOpts(name='销售量'),
        yaxis_opts=opts.AxisOpts(name='商品类型'),
        tooltip_opts=opts.TooltipOpts(trigger="axis"),  # 提示框触发方式
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))  # 设置标签格式
)

# 渲染图表到HTML文件
bar.render('第一题.html')

第二题

利用pyecharts绘制学生身高和体重关系的散点图,数据:学生身高和体重数据.xlsx。要求:要有初始配置项,系列配置项和全局配置项的各种配置,包括:画布宽度,高度,主题风格,添加主标题,标记点大小设置,形状设置,x轴和y轴刻度线设置,分割线设置,对视觉映射配置项VisualMap进行设置,最大值最小值要和数据匹配,标记点的过渡色设置。

python 复制代码
from pyecharts.charts import Scatter
from pyecharts import options as opts
import pandas as pd

# 读取Excel文件中的数据
df = pd.read_excel('学生身高和体重数据.xlsx')

# 确保数据中有 '身高' 和 '体重' 列
height = df['身高'].tolist()
weight = df['体重'].tolist()

# 创建一个散点图对象
scatter = Scatter()

# 添加数据到散点图
scatter.add_xaxis(height)
scatter.add_yaxis(
    series_name='学生身高与体重关系',
    y_axis=weight,
    symbol_size=10,  # 标记点大小设置
    symbol='circle',  # 形状设置
    label_opts=opts.LabelOpts(is_show=False)  # 不显示标签
)

# 设置全局配置项
scatter.set_global_opts(
    title_opts=opts.TitleOpts(title='学生身高和体重关系散点图'),  # 添加主标题
    xaxis_opts=opts.AxisOpts(
        type_='value',
        name='身高 (cm)',
        axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color='#5793f3')),
        splitline_opts=opts.SplitLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color='#5793f3'))
    ),
    yaxis_opts=opts.AxisOpts(
        type_='value',
        name='体重 (kg)',
        axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color='#d14a61')),
        splitline_opts=opts.SplitLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color='#d14a61'))
    ),
    visualmap_opts=opts.VisualMapOpts(
        max_=max(weight),  # 设置最大值,确保与数据匹配
        min_=min(weight),  # 设置最小值,确保与数据匹配
        range_color=['#d14a61', '#dea356', '#f4e925', '#5793f3']  # 标记点的过渡色设置
    )
)

# 渲染图表为HTML文件
scatter.render('第二题.html')

第三题

利用pyecharts绘制商家A和商家B销售的折线图,数据:商家A和商家B的各类商品的销售数据.xlsx,要求:努力美化所画的折线图,可以参照第一个任务的方法。

python 复制代码
from pyecharts import options as opts
from pyecharts.charts import Line
import pandas as pd
from pyecharts.globals import ThemeType

# 读取数据
df = pd.read_excel('商家A和商家B的各类商品的销售数据.xlsx', index_col='商家')

# 创建折线图
line = (
    Line(init_opts=opts.InitOpts(width='1000px', height='600px', theme=ThemeType.LIGHT))  # 设置主题
    .add_xaxis(df.columns.tolist())  # 设置X轴为商品类型
    .add_yaxis('商家A', df.loc['商家A'].tolist(),  # 添加商家A的数据
               label_opts=opts.LabelOpts(is_show=True, position='top', color='#C1232B'),  # 标签设置
               symbol='circle', symbol_size=8,  # 设置标记点样式
               itemstyle_opts=opts.ItemStyleOpts(color='#C1232B'),  # 设置线条颜色
               markline_opts=opts.MarkLineOpts(
                   data=[opts.MarkLineItem(type_="average", name="商家A平均值")]  # 平均值标线
               )
               )
    .add_yaxis('商家B', df.loc['商家B'].tolist(),  # 添加商家B的数据
               label_opts=opts.LabelOpts(is_show=True, position='top', color='#2F4554'),  # 标签设置
               symbol='diamond', symbol_size=8,  # 设置标记点样式
               itemstyle_opts=opts.ItemStyleOpts(color='#2F4554'),  # 设置线条颜色
               markline_opts=opts.MarkLineOpts(
                   data=[opts.MarkLineItem(type_="average", name="商家B平均值")]  # 平均值标线
               )
               )
    .set_global_opts(
        title_opts=opts.TitleOpts(title='商家A和商家B销售折线图', subtitle='各类商品的销售数据'),
        xaxis_opts=opts.AxisOpts(
            name='商品类型',
            name_location='center',
            name_gap=30,
            axislabel_opts=opts.LabelOpts(font_size=12, rotate=45)  # 设置X轴标签字体和旋转角度
        ),
        yaxis_opts=opts.AxisOpts(
            name='销售量',
            name_location='center',
            name_gap=40,
            axislabel_opts=opts.LabelOpts(font_size=12)
        ),
        tooltip_opts=opts.TooltipOpts(trigger="axis"),  # 设置为触发器为 "axis"
        legend_opts=opts.LegendOpts(
            pos_top="10%",
            pos_left="center",
            textstyle_opts=opts.TextStyleOpts(font_size=14)
        ),
        toolbox_opts=opts.ToolboxOpts(is_show=True, orient="vertical", pos_left="right", pos_top="center")  # 工具栏
    )
    .set_series_opts(
        label_opts=opts.LabelOpts(is_show=True, position="top"),  # 显示数据标签,位置在上方
        linestyle_opts=opts.LineStyleOpts(width=3, type_='solid')  # 设置折线的样式
    )
)

# 渲染图表到HTML文件
line.render('第三题.html')

第四题

利用pyecharts绘制成绩的箱线图,数据:语文考试成绩.xlsx,要求:努力美化所画的箱线图,可以参照第一个任务的方法。

|----|----|----|----|-----|----|----|----|----|----|----|----|----|----|
| 班级 | 成绩 |||||||||||||
| 1班 | 68 | 99 | 46 | 77 | 94 | 40 | 79 | 20 | 88 | 89 | 76 | 92 | 95 |
| 2班 | 79 | 88 | 35 | 57 | 78 | 69 | 78 | 99 | 75 | 46 | 88 | 87 | 89 |
| 3班 | 91 | 82 | 63 | 86 | 77 | 78 | 32 | 96 | 80 | 86 | 64 | 67 | 96 |
| 4班 | 72 | 82 | 45 | 100 | 67 | 89 | 90 | 90 | 89 | 69 | 79 | 91 | 92 |

python 复制代码
import pandas as pd
from pyecharts.charts import Boxplot
from pyecharts import options as opts
from pyecharts.globals import ThemeType

# 读取Excel文件中的数据,假设第一列是"班级"
df = pd.read_excel('语文考试成绩.xlsx', index_col=0)

# 确保"班级"列存在,并将其设置为索引(如果它不是索引的话)
# 但在这个例子中,我们不需要将"班级"设置为索引,因为我们将直接使用它
# 如果"班级"列不是第一列,您可能需要通过列名来引用它,例如 df['班级']

# 提取班级和成绩数据
# 我们将使用groupby来按班级聚合成绩
boxplot_data = []
for class_name in df.index:
    scores = df.loc[class_name, df.columns[1:]]  # 选择除了第一列(班级名)之外的所有列
    scores_list = scores.tolist()  # 将Pandas Series转换为列表
    boxplot_data.append(scores_list)  # 将这个列表添加到总列表中

categories = df.index.tolist()  # 班级名称作为类别

# 创建箱线图
# 绘制箱线图
boxplot = (
    Boxplot()
    .add_xaxis(categories)  # 设置x轴为班级名称
    .add_yaxis(
        "语文成绩",  # 系列名称
        boxplot_data,
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="各班级语文考试成绩箱线图"),
        xaxis_opts=opts.AxisOpts(name="班级"),
        yaxis_opts=opts.AxisOpts(name="成绩"),
        toolbox_opts=opts.ToolboxOpts(),  # 添加工具箱
        legend_opts=opts.LegendOpts(is_show=True, pos_left="left")  # 图例显示在左侧
    )
)

# 渲染图表
boxplot.render('第四题.html')

第五题

利用pyecharts绘制有关运动员的最大携氧能力、体重和运动后心率三者关系的3D散点图,数据:运动员的最大携氧能力、体重和运动后心率数据.xlsx,要求:努力美化所画的3D散点图,可以参照第一个任务的方法。

python 复制代码
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Scatter3D

# 读取CSV文件
file_path = '运动员的最大携氧能力、体重和运动后心率数据.csv'
df = pd.read_csv(file_path)

# 将DataFrame转换为列表,准备绘图
data = df.values.tolist()

# 创建3D散点图
scatter3d = (
    Scatter3D()
    .add(
        series_name="运动员数据",
        data=data,
        xaxis3d_opts=opts.Axis3DOpts(name='最大携氧能力 (ml/min)', type_='value'),
        yaxis3d_opts=opts.Axis3DOpts(name='体重 (kg)', type_='value'),
        zaxis3d_opts=opts.Axis3DOpts(name='运动后心率 (次/分钟)', type_='value'),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="运动员最大携氧能力、体重与运动后心率的关系"),
        visualmap_opts=opts.VisualMapOpts(
            max_=180,
            range_color=['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61',
                         '#f46d43', '#d73027'],
        ),
    )
)

# 渲染图表
scatter3d.render('第五题.html')

第六题

利用pyecharts的饼图的绘制商家A的销售情况,数据:商家A和商家B的各类商品的销售数据.csv,要求:努力美化所画的饼图,可以参照第一个任务的方法。

python 复制代码
#导入整个实验所需的包
import pandas as pd
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Pie

#读取"商家A和商家B的各类商品的销售数据.xlsx"文件数据
data = pd.read_excel('商家A和商家B的各类商品的销售数据.xlsx',
                     index_col='商家', engine="openpyxl")
#设置了图表的初始选项,包括图表的宽度、高度以及主题(这里设置为亮色主题)
init_opts = opts.InitOpts(width='1000px', height='450px', theme=ThemeType.LIGHT)
#绘制两个商家的柱形图
pie = (Pie()
       .add('', [list(z) for z in zip(data.columns.tolist(), data.loc['商家A'].tolist())])
       .set_global_opts(title_opts=opts.TitleOpts(title='商家A销售情况饼图'))
       .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c} ({d}%)'))
       )
pie.render_notebook()
#渲染图表
pie.render('第六题.html')
相关推荐
_.Switch1 小时前
FastAPI 的进阶应用与扩展技术:异步编程与协程、websocket、celery
网络·数据库·python·websocket·网络协议·性能优化·fastapi
TENGZO2 小时前
从客户跟进到库存管理:看板工具赋能新能源汽车销售
经验分享·信息可视化·团队开发·软件需求
咖猫3 小时前
Guava 库中的 `Multimap` 是一个允许一个键对应多个值的集合 Guava `Multimap` 的基本代码示例:
开发语言·python·guava
觅远4 小时前
python实现Word转PDF(comtypes、win32com、docx2pdf)
python·pdf·自动化·word
CV猿码人4 小时前
在已经加载的页面中动态显示一段话或者一张图片
python
宸码5 小时前
【项目实战】ISIC 数据集上的实验揭秘:UNet + SENet、Spatial Attention 和 CBAM 的最终表现
人工智能·python·深度学习·神经网络·机器学习·计算机视觉
lly_csdn1235 小时前
【路径规划】原理及实现
python·算法·路径规划
豌豆花下猫5 小时前
Python 潮流周刊#82:美国 CIA 如何使用 Python?(摘要)
后端·python·ai
资源补给站6 小时前
大恒相机开发(1)—Python调用采集彩色图像并另存为本地
开发语言·python·数码相机
旷野..6 小时前
GPT 时代,精进编程思维 + 熟练 Prompt 是否是新的编程范式?
python·gpt·prompt