Python数据可视化——折线图

目录

一、JSON数据格式

1. 什么是JSON

2. JSON的作用

3. Python与JSON相互转换

4. 处理中文

二、pyecharts模块介绍

1. 安装pyecharts

2. pyecharts画廊

三、pyecharts快速入门

1. 基础折线图

2. 多条折线图

3. 设置线条样式

四、数据处理

1. 处理原始JSON数据

2. 提取疫情数据

五、创建折线图(完整案例)

案例:2020年印美日新冠累计确诊人数对比图

六、全局配置项详解

配置示例

七、系列配置项详解

八、常用工具速查

1. JSON转换

2. pyecharts导入

3. 基础模板

4. 文件输出

九、注意事项


一、JSON数据格式

1. 什么是JSON

JSON:轻量级的数据交互格式,本质上是带有特定格式的字符串

# JSON格式示例1:字典形式
{"name": "admin", "age": 18}
​
# JSON格式示例2:列表形式(包含多个字典)
[
    {"name": "admin", "age": 18},
    {"name": "root", "age": 16},
    {"name": "张三", "age": 20}
]

2. JSON的作用

在不同编程语言之间传递数据时,JSON作为通用的数据格式。

3. Python与JSON相互转换

import json
​
# Python转JSON:json.dumps()
print("=== Python转JSON ===")
data = [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]
json_data = json.dumps(data)
print(f"Python数据:{data}")
print(f"JSON数据:{json_data}")
print(f"JSON类型:{type(json_data)}")   # <class 'str'>
​
# JSON转Python:json.loads()
print("\n=== JSON转Python ===")
json_str = '[{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]'
python_data = json.loads(json_str)
print(f"JSON字符串:{json_str}")
print(f"Python数据:{python_data}")
print(f"Python类型:{type(python_data)}")   # <class 'list'>

输出:

=== Python转JSON ===
Python数据:[{'name': '老王', 'age': 16}, {'name': '张三', 'age': 20}]
JSON数据:[{"name": "\u8001\u738b", "age": 16}, {"name": "\u5f20\u4e09", "age": 20}]
JSON类型:<class 'str'>
​
=== JSON转Python ===
JSON字符串:[{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]
Python数据:[{'name': '老王', 'age': 16}, {'name': '张三', 'age': 20}]
Python类型:<class 'list'>

4. 处理中文

import json
​
data = [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]
​
# 不处理中文:中文会被转义
json_data1 = json.dumps(data)
print(json_data1)   # [{"name": "\u8001\u738b", "age": 16}...]
​
# 处理中文:使用 ensure_ascii=False
json_data2 = json.dumps(data, ensure_ascii=False)
print(json_data2)   # [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]

二、pyecharts模块介绍

1. 安装pyecharts

pip install pyecharts

2. pyecharts画廊

官方示例:https://gallery.pyecharts.org/#/README


三、pyecharts快速入门

1. 基础折线图

# 导入模块
from pyecharts.charts import Line
from pyecharts import options as opts
​
# 创建折线图对象
line = Line()
​
# 添加x轴数据
line.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
​
# 添加y轴数据
line.add_yaxis("销售额", [100, 120, 150, 180, 200, 250])
​
# 设置全局配置
line.set_global_opts(
    title_opts=opts.TitleOpts(title="月度销售趋势", pos_left="center"),
    xaxis_opts=opts.AxisOpts(name="月份"),
    yaxis_opts=opts.AxisOpts(name="销售额(万元)"),
    legend_opts=opts.LegendOpts(pos_left="70%"),
)
​
# 生成HTML文件
line.render("sales.html")
print("折线图已生成:sales.html")

2. 多条折线图

from pyecharts.charts import Line
from pyecharts import options as opts
​
# 创建折线图对象
line = Line()
​
# 添加x轴数据
line.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
​
# 添加多条y轴数据
line.add_yaxis("产品A", [100, 120, 150, 180, 200, 250])
line.add_yaxis("产品B", [80, 90, 110, 130, 160, 190])
line.add_yaxis("产品C", [60, 70, 85, 100, 120, 140])
​
# 设置全局配置
line.set_global_opts(
    title_opts=opts.TitleOpts(title="产品月度销售对比", pos_left="center"),
    xaxis_opts=opts.AxisOpts(name="月份"),
    yaxis_opts=opts.AxisOpts(name="销售额(万元)"),
    tooltip_opts=opts.TooltipOpts(trigger="axis"),  # 鼠标悬停显示
)
​
line.render("products.html")
print("多条折线图已生成:products.html")

3. 设置线条样式

from pyecharts.charts import Line
from pyecharts import options as opts
​
line = Line()
​
line.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
​
# 设置线条样式
line.add_yaxis(
    "销售额",
    [100, 120, 150, 180, 200, 250],
    linestyle_opts=opts.LineStyleOpts(width=3, color="red", type_="solid"),
    symbol="circle",           # 标记点形状:circle, diamond, triangle, rect
    symbol_size=10,            # 标记点大小
    label_opts=opts.LabelOpts(is_show=True),  # 显示数值标签
)
​
line.set_global_opts(
    title_opts=opts.TitleOpts(title="销售趋势图", pos_left="center"),
    tooltip_opts=opts.TooltipOpts(trigger="axis"),
)
​
line.render("line_style.html")
print("样式折线图已生成:line_style.html")

四、数据处理

1. 处理原始JSON数据

import json
​
# 原始数据(带有JSONP回调函数)
raw_data = 'jsonp_1629350871167_29498({"data": [{"trend": {"updateDate": ["2020-01-01", "2020-01-02"], "list": [{"data": [100, 200]}]}}]})'
​
print("=== 数据清理前 ===")
print(raw_data[:80] + "...")
​
# 去掉JSONP回调函数前缀
cleaned_data = raw_data.replace('jsonp_1629350871167_29498(', '')
# 去掉末尾的 ");"
cleaned_data = cleaned_data[:-2]
​
print("\n=== 数据清理后 ===")
print(cleaned_data[:80] + "...")
​
# 转换为Python字典
data_dict = json.loads(cleaned_data)
​
print("\n=== 转换后的Python数据 ===")
print(f"数据类型:{type(data_dict)}")  # <class 'dict'>
print(f"数据键:{data_dict.keys()}")

2. 提取疫情数据

import json
​
# 模拟疫情数据(简化版)
data = {
    "data": [
        {
            "trend": {
                "updateDate": [
                    "2020-01-01", "2020-01-02", "2020-01-03",
                    "2020-01-04", "2020-01-05", "2020-01-06"
                ],
                "list": [
                    {"name": "美国", "data": [100, 120, 150, 180, 200, 250]},
                    {"name": "印度", "data": [50, 60, 80, 100, 130, 160]},
                    {"name": "日本", "data": [20, 25, 30, 35, 40, 45]}
                ]
            }
        }
    ]
}
​
# 获取趋势数据
trend_data = data["data"][0]["trend"]
​
# 获取日期(x轴)
x_data = trend_data["updateDate"]
print(f"日期数据:{x_data}")
​
# 获取各国确诊数据(y轴)
for country in trend_data["list"]:
    print(f"{country['name']}:{country['data']}")
​
# 只获取2020年的数据(前314天)
x_2020 = trend_data["updateDate"][:314]
us_data = trend_data["list"][0]["data"][:314]
india_data = trend_data["list"][1]["data"][:314]
japan_data = trend_data["list"][2]["data"][:314]
​
print(f"\n2020年数据条数:{len(x_2020)}")

五、创建折线图(完整案例)

案例:2020年印美日新冠累计确诊人数对比图

import json
from pyecharts.charts import Line
from pyecharts import options as opts
​
# 模拟数据(实际项目中从JSON文件读取)
# 生成2020年日期(1月1日到12月31日)
dates = [f"2020-{m:02d}-{d:02d}" for m in range(1, 13) for d in range(1, 29)]
dates = dates[:314]  # 取314天
​
# 模拟各国确诊数据
us_data = [i * 1000 + (i ** 2) for i in range(314)]
india_data = [i * 800 + (i ** 1.8) for i in range(314)]
japan_data = [i * 200 + (i ** 1.5) for i in range(314)]
​
print("=== 数据统计 ===")
print(f"日期范围:{dates[0]} 至 {dates[-1]}")
print(f"美国最终确诊数:{us_data[-1]:,}")
print(f"印度最终确诊数:{india_data[-1]:,}")
print(f"日本最终确诊数:{japan_data[-1]:,}")
​
# 创建折线图
line = Line()
​
# 添加x轴数据
line.add_xaxis(dates)
​
# 添加y轴数据(三条折线)
line.add_yaxis(
    "美国🇺🇸",
    us_data,
    linestyle_opts=opts.LineStyleOpts(width=2, color="#EF553B"),
    symbol="circle",
    symbol_size=5,
    label_opts=opts.LabelOpts(is_show=False),  # 数据点太多,不显示标签
)
​
line.add_yaxis(
    "印度🇮🇳",
    india_data,
    linestyle_opts=opts.LineStyleOpts(width=2, color="#636EFA"),
    symbol="diamond",
    symbol_size=5,
    label_opts=opts.LabelOpts(is_show=False),
)
​
line.add_yaxis(
    "日本🇯🇵",
    japan_data,
    linestyle_opts=opts.LineStyleOpts(width=2, color="#00CC96"),
    symbol="triangle",
    symbol_size=5,
    label_opts=opts.LabelOpts(is_show=False),
)
​
# 设置全局配置
line.set_global_opts(
    title_opts=opts.TitleOpts(
        title="2020年 印🇮🇳美🇺🇸日🇯🇵 累计确诊人数对比图",
        pos_left="center",
        title_textstyle_opts=opts.TextStyleOpts(font_size=18)
    ),
    xaxis_opts=opts.AxisOpts(
        name="时间",
        name_location="middle",
        name_gap=35,
        axislabel_opts=opts.LabelOpts(rotate=45, interval=30)  # 标签旋转45度,每30个显示一个
    ),
    yaxis_opts=opts.AxisOpts(
        name="累计确诊人数",
        name_location="middle",
        name_gap=50,
        axislabel_opts=opts.LabelOpts(formatter="{value}")  # 格式化
    ),
    tooltip_opts=opts.TooltipOpts(
        trigger="axis",          # 鼠标悬停触发
        axis_pointer_type="shadow"  # 阴影指示器
    ),
    legend_opts=opts.LegendOpts(
        pos_left="70%",          # 图例位置
        pos_top="5%",
        item_width=30,
        item_height=15
    ),
    datazoom_opts=opts.DataZoomOpts(  # 添加缩放控件
        range_start=0,
        range_end=100,
        is_show=True
    ),
)
​
# 生成HTML文件
line.render("covid_comparison.html")
print("\n✅ 折线图已生成:covid_comparison.html")
print("请在浏览器中打开该文件查看可视化效果")

六、全局配置项详解

配置项说明常用参数
标题配置TitleOpts设置图表标题title, pos_left, pos_top
x轴配置AxisOpts设置x轴name, type_, axislabel_opts
y轴配置AxisOpts设置y轴name, type_, min_, max_
图例配置LegendOpts设置图例pos_left, pos_top, orient
提示框配置TooltipOpts鼠标悬停提示trigger, axis_pointer_type
缩放配置DataZoomOpts数据缩放控件range_start, range_end
工具栏配置ToolboxOpts保存图片等工具is_show, feature

配置示例

from pyecharts.charts import Line
from pyecharts import options as opts
​
line = Line()
line.add_xaxis(["A", "B", "C", "D"])
line.add_yaxis("数据", [10, 20, 30, 40])
​
line.set_global_opts(
    # 标题配置
    title_opts=opts.TitleOpts(
        title="主标题",
        subtitle="副标题",
        pos_left="center",
        title_textstyle_opts=opts.TextStyleOpts(font_size=20)
    ),
    # x轴配置
    xaxis_opts=opts.AxisOpts(
        name="X轴名称",
        axislabel_opts=opts.LabelOpts(rotate=45)  # 标签旋转
    ),
    # y轴配置
    yaxis_opts=opts.AxisOpts(
        name="Y轴名称",
        min_=0,  # 最小值
        max_=50, # 最大值
        is_show=True
    ),
    # 图例配置
    legend_opts=opts.LegendOpts(
        pos_left="70%",
        pos_top="5%",
        orient="vertical"  # 垂直排列
    ),
    # 提示框配置
    tooltip_opts=opts.TooltipOpts(
        trigger="axis",
        formatter="{b}: {c}"  # 自定义格式
    ),
    # 缩放控件
    datazoom_opts=opts.DataZoomOpts(is_show=True),
)
​
line.render("config_demo.html")

七、系列配置项详解

配置项说明示例
线条样式LineStyleOpts设置线条颜色、宽度width=2, color="red"
标记点symbol点的形状"circle", "diamond"
标记点大小symbol_size点的大小symbol_size=8
标签LabelOpts是否显示数值is_show=True
面积样式AreaStyleOpts填充面积opacity=0.3
平滑曲线is_smooth是否平滑is_smooth=True
# 完整系列配置示例
line.add_yaxis(
    "数据",
    [10, 20, 30, 40],
    # 线条样式
    linestyle_opts=opts.LineStyleOpts(
        width=3,           # 线宽
        color="red",       # 颜色
        type_="dashed"     # 线条类型:solid, dashed, dotted
    ),
    # 标记点
    symbol="circle",
    symbol_size=8,
    # 标签
    label_opts=opts.LabelOpts(
        is_show=True,      # 显示数值
        position="top"     # 位置:top, bottom, left, right
    ),
    # 平滑曲线
    is_smooth=True,
    # 面积填充
    areastyle_opts=opts.AreaStyleOpts(
        opacity=0.3
    ),
)

八、常用工具速查

1. JSON转换

操作方法示例
Python → JSONjson.dumps()json.dumps(data, ensure_ascii=False)
JSON → Pythonjson.loads()json.loads(json_str)

2. pyecharts导入

from pyecharts.charts import Line      # 折线图
from pyecharts import options as opts  # 配置项

3. 基础模板

from pyecharts.charts import Line
from pyecharts import options as opts
​
# 1. 创建图表对象
line = Line()
​
# 2. 添加数据
line.add_xaxis(x_data)
line.add_yaxis("系列名", y_data)
​
# 3. 设置配置
line.set_global_opts(
    title_opts=opts.TitleOpts(title="标题"),
)
​
# 4. 生成文件
line.render("output.html")

4. 文件输出

# 生成HTML文件
line.render("文件名.html")
​
# 在Jupyter Notebook中直接显示
# line.render_notebook()

九、注意事项

  1. 数据清理:从网络获取的JSON数据可能带有JSONP回调函数,需要先清理

  2. 中文处理json.dumps() 时需要添加 ensure_ascii=False

  3. x轴标签过多:使用 axislabel_opts=opts.LabelOpts(rotate=45, interval=30)

  4. 数据点过多:使用 DataZoomOpts 添加缩放控件

  5. HTML预览:生成的HTML文件需要用浏览器打开查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值