数据可视化(Matplotlib和pyecharts) - 宋马

数据可视化(Matplotlib和pyecharts)

一 常见图形概念及使用

图表类型 适用场景 核心特点
柱状图(bar) 比较不同类别数据(如各地区销售额对比)、时间序列分析(离散时间) 高度反映数值大小,支持横向/纵向展示,可叠加分组
折线图(plot) 连续数据趋势比较(适合展示随时间的变化,如股票价格走势、用户增长趋势)、多变量趋势比较 通过线段连接数据点,强调连续性变化
散点图(scatter) 分析变量间相关性(如身高与体重关系),聚类分析初步观察 用点分布揭示数据模式,可添加回归线
饼图/环形图(pie) 显示比例分布(如市场份额占比)、简单分类(不适合多分类情况) 扇形面积代表比例,环形图可突出中心信息
热力图HeatMap() 矩阵数据密度展示(如用户活跃时段分布、网页点击热区) 颜色深浅映射数值大小,适合高维度数据聚类
箱线图(boxplot) 数据分布统计(如收入中位数、异常值检测)、实验的分组之间结果比较 展示最小值、Q1、中位数、Q3、最大值,识别数据离散度
雷达图(polar) 多维能力评估(如技能评分、产品属性对比) 多边形顶点表示维度,面积反映综合能力
地理地图(pyecharts) 空间数据可视化(如疫情分布、物流网络) 结合经纬度坐标,支持气泡图、热力层叠加

选择原则

明确目标: 趋势分析用折线图,占比用饼图,分布用散点/箱线图
简化维度: 避免过度复杂(如3D图表可能降低可读性)
颜色规范: 使用差异明显的色系,色盲友好(避免红绿对比)

热力图(Heatmap)

概念:热力图是一种以颜色深浅来表示数据大小的二维图形。颜色通常从浅到深表示数值从低到高,或者相反。
使用场景

二维数据展示 :用于展示二维数据矩阵中的数值分布情况。例如,展示不同时间段不同地区的销售额热度,或者基因表达矩阵中基因在不同样本中的表达水平。
密度展示 :可以用于展示数据点的密度分布。例如,在地理信息系统(GIS)中展示人口密度。

二、Matplotlib

(一)Matplotlib 简介

Matplotlib 是 Python 中最常用的绘图库之一,它提供了丰富的绘图功能,可以用于绘制各种静态、动态、交互式的二维和三维图形。

(二)基本图形绘制

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 生成数据
    x = np.linspace(0, 10, 100)
    y = np.sin(x)
    
    # 创建画布与子图
    fig, ax = plt.subplots(figsize=(8, 4))
    
    # 绘制折线图
    # linewidth(线宽)、markersize(标记大小)、alpha(透明度)
    # fontsize 和 fontfamily 用于设置标题和标签的字体大小和字体系列。
    
    
    ax.plot(x, y, label='sin(x)', color='blue', linestyle='--')
    ax.set_title("Sine Wave")          # 标题
    ax.set_xlabel("X Axis")           # X轴标签
    ax.set_ylabel("Y Axis")           # Y轴标签
    ax.legend()                       # 显示图例
    ax.grid(True, linestyle=':')      # 网格线
    
    plt.show()  # 展示图形

多子图与样式控制

    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 6))
    
    # 第一个子图:柱状图
    axes[0,0].bar(['A', 'B', 'C'], [20, 35, 30], color=['#FF6B6B', '#4ECDC4', '#556270'])
    axes[0,0].set_title("Bar Chart")
    
    # 第二个子图:散点图
    x = np.random.randn(100)
    y = x + np.random.randn(100)*0.5
    axes[0,1].scatter(x, y, alpha=0.6, edgecolors='w',cmap='viridis') # `cmap` 设置颜色映射表
    axes[0,1].set_title("Scatter Plot")
    # 散点图额外的代码,添加颜色条
    cbar = plt.colorbar(scatter)
    cbar.set_label('Color Intensity')
    
    # 第三个子图:箱线图
    data = [np.random.normal(0, std, 100) for std in range(1, 4)]
    axes[1,0].boxplot(data, vert=True, patch_artist=True)
    axes[1,0].set_xticklabels(['Group 1', 'Group 2', 'Group 3'])
    
    # 第四个子图:填充图
    x = np.arange(0, 4 * np.pi, 0.1)
    y = np.cos(x)
    axes[1,1].fill_between(x, y, where=(y > 0), color='green', alpha=0.3)
    axes[1,1].set_title("Area Chart")
    
    plt.tight_layout()  # 自动调整子图间距
    plt.savefig('output.png', dpi=300)  # 保存高清图像
    plt.show()
    
    # 饼图
    # sizes参数是各部分的数值,labels参数是各部分的标签,autopct用于设置显示百分比的格式,startangle 设置饼图的起始角度,colors设置各部分的颜色。
    ax.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90, colors=['gold', 'lightcoral', 'lightskyblue', 'lightgreen'])
    ax.axis('equal') # 确保是圆形
    
    # 热力图
    # cmap参数设置颜色映射表,interpolation设置插值方法。颜色条通过 `colorbar()` 添加,用于表示热力图中颜色对应的数值。
    heatmap = ax.imshow(data, cmap='hot', interpolation='nearest')
    cbar = plt.colorbar(heatmap)
    cbar.set_label('Value')
    ax.set_title('Heatmap Example')ax.set_xlabel('X-axis')ax.set_ylabel('Y-axis')
    plt.show()

高级技巧

样式主题:通过plt.style.use('ggplot')切换预定义主题(如seaborn, bmh

动画绘制:使用FuncAnimation创建动态图表

3D图形:

    from mpl_toolkits.mplot3d import Axes3D
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.plot_surface(X, Y, Z, cmap='viridis')

三、pyecharts

(一)pyecharts 简介

pyecharts 是一个基于 Echarts(一个由百度开源的数据可视化库)的 Python 包装库,它允许用户使用简单的 Python 代码生成交互式的可视化图表。pyecharts 提供了丰富的图表类型和高度的自定义能力,并且可以轻松地将图表集成到 Web 应用中。

(二)基本图形绘制

    # 柱状图
    from pyecharts.charts import Barfrom pyecharts 
    import options as opts
    categories = ['A', 'B', 'C', 'D']
    values = [23, 45, 12, 38]
    bar = Bar()
    bar.add_xaxis(categories) # 添加 X 轴的分类数据,
    bar.add_yaxis('Values', values) # 添加 Y 轴的数值数据和系列名称
    bar.set_global_opts(title_opts=opts.TitleOpts(title='Bar Chart Example')) # 设置全局变量
    bar.render('bar_chart.html') # 将图表渲染为 HTML 文件,可以在浏览器中打开查看
    
    # 折线图
    x = ['Jan', 'Feb', 'Mar', 'Apr', 'May']
    y = [23, 45, 32, 67, 53]
    line = Line()
    line.add_xaxis(x) 
    line.add_yaxis('Monthly Data', y) # 添加数据
    line.set_global_opts(title_opts=opts.TitleOpts(title='Line Chart Example'), xaxis_opts=opts.AxisOpts(name='Month'), yaxis_opts=opts.AxisOpts(name='Value')) # 设置全局变量
    line.render('line_chart.html') # 渲染图表
    
    # 饼图
    labels = ['Product A', 'Product B', 'Product C', 'Product D']
    values = [15, 30, 25, 30]
    pie = Pie()
    pie.add('', [list(z) for z in zip(labels, values)])
    pie.set_global_opts(title_opts=opts.TitleOpts(title='Pie Chart Example'))
    pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
    pie.render('pie_chart.html')

(三)复杂图表示例

地理热力图

    from pyecharts.charts import Geo
    from pyecharts.globals import ChartType
    
    data = [("北京", 100), ("上海", 88), ("广州", 66), ("深圳", 55), ("成都", 44)]
    
    geo = (
        Geo()
        .add_schema(maptype="china")
        .add(
            "城市热度",
            data_pair=data,
            type_=ChartType.HEATMAP,
            blur_size=20,
        )
        .set_global_opts(
            visualmap_opts=opts.VisualMapOpts(max_=100),
            title_opts=opts.TitleOpts(title="中国主要城市热度分布"),
        )
    )
    
    geo.render("geo_heatmap.html")

2. 动态仪表盘

    
    from pyecharts.charts import Gauge
    
    gauge = (
        Gauge()
        .add(
            series_name="业务指标",
            data_pair=[("完成率", 78.5)],
            axisline_opts=opts.AxisLineOpts(
                linestyle_opts=opts.LineStyleOpts(
                    color=[(0.3, "#67e0e3"), (0.7, "#37a2da"), (1, "#fd666d")], width=30
                )
            ),
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="项目进度监控"),
            legend_opts=opts.LegendOpts(is_show=False),
        )
    )
    
    gauge.render("gauge.html")

(四) Matplotlib VS pyecharts

维度 Matplotlib pyecharts
渲染方式 静态图像(PNG/SVG/PDF) 动态HTML(支持缩放、悬停交互)
学习曲线 陡峭(需掌握Figure/Axes对象体系) 平缓(链式调用,配置项直观)
交互能力 有限(依赖GUI后端) 强大(内置工具栏、数据筛选)
应用场景 科研论文、印刷报告 网页看板、实时数据监控
扩展性 支持自定义Artist对象 依赖ECharts生态(可扩展主题)

(五)最佳实践与注意事项

数据清洗优先:可视化前确保数据无缺失、异常值
图表一致性:同一报告中保持颜色、字体风格统一
交互设计

在pyecharts中添加TooltipOpts优化提示信息
使用DataZoom控件处理大数据集缩放

性能优化

Matplotlib大数据绘图时优先使用rasterized=True
pyecharts分页加载超过万级数据点

错误示例修正

避免饼图超过7个分类(改用条形图)
折线图时间轴不均匀时使用set_xticks手动校准

四 总结

数据可视化是数据分析的“最后一公里”,合理选择工具与图表类型能显著提升信息传达效率:

Matplotlib:适合精细化控制的静态图表,满足学术出版要求

pyecharts:快速构建交互式看板,适配现代Web应用掌握两者结合使用(如用Matplotlib做探索性分析,pyecharts生成最终报告),可覆盖从数据分析到展示的全流程需求。

请登录后发表评论

    没有回复内容