jetbrains canal安装 Jetson Nano Gradle audio tree devise postman Select2 vue双向绑定 php抽奖源码 软件测试实战项目 mac虚拟打印机 java反射方法 js数组截取前5个 汇编语言clr python计算器 python获取数据类型 python命令行 python的编译器 javaforeach java环境部署 java替换字符 java单继承 java中接口的定义 java集合类 liunx命令大全 nginx安装教程 java游戏开发教程 linux内核编程 打马赛克的软件 EasyCHM 3389扫描器 fireworks8 华为手机刷公交卡 奥法隐藏外观 ps反向选择的快捷键 相册制作工具 网络驱动 jsp源码
当前位置: 首页 > 学习教程  > python

Python - Matplotlib 绘制折线图 <lpliner>

2021/2/6 22:25:18 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

背景: 最近在工作中接触到了数据分析,其中需要绘制折线图,在经过一番查找和改善之后,最终写了一个自用的函数,在此特做保留,以防丢失 目录 Code使用方法示例图写在后面 Code # 绘制图表 def plt_show(x:…

背景:

  • 最近在工作中接触到了数据分析,其中需要绘制折线图,在经过一番查找和改善之后,最终写了一个自用的函数,在此特做保留,以防丢失

目录

  • Code
  • 使用方法
  • 示例图
  • 写在后面

Code

# 绘制图表
def plt_show(x: dict,
             y: Union[dict, List[dict]],
             size: Tuple[int, int],
             subplot: Tuple[int, int] = (2, 2),
             isSubplot: bool = True) -> None:
    """
    根据传入的数据进行折线图的绘制
    :param x: x轴坐标数据
        x = dict(
                data=<List>,    # 数据集
                name=<xName>    # x轴名称
                xlim=(1, 100)   # x轴数据范围
                )
    :param y: y轴需要绘制的数据
        y = dict(
                data=<List>,    # 数据集
                name=<yName>,   # y轴名称
                line="r-",      # 绘制线条及颜色,r:red, -:直线,其余样式自行网查
                label=<Label>,  # 表格上提示部分的线段名称
                title=<Title>   # 表格title
                )
    :param size: 画布大小
        size = (8, 4)           # width, height
    :param subplot: 同时绘制图表的网格尺寸, 当isSubplot为True是才需要设置, 默认设置(2, 2)
        subplot = (2, 2)        # 在2*2的网格中分别绘制图表
    :param isSubplot: 是否使用网格绘制图表
        isSubplot: True/False
    :return: None
    """

    # 获取x轴数据、名称、数据范围
    x_data = x["data"]
    x_name = x.get("name", "")
    x_lim = x.get("xlim", None)

    # size判断,如果输入有误,则默认使用(8, 4)
    if not size or not all([isinstance(x, int) for x in size]):
        size = (8, 4)

    # 准备画布
    plt.figure(figsize=size)

    # 修改字体,设置中文正常显示
    plt.rcParams["font.sans-serif"] = ["simHei"]

    # 添加x轴名称
    plt.xlabel(x_name)

    # 获取y轴数据,如果为dict则生成List[dict]
    if isinstance(y, dict):
        y = [y]

    # 1.绘制曲线
    # 遍历y轴数据集
    data_length = len(y)
    start_index = 1
    for y_ in y:
        if start_index > data_length:       # 如果index超过数据总长度则break
            break

        # 获取需要绘制的y轴数据
        y_data = y_["data"]                 # 数据集
        y_name = y_.get("name", "")         # y轴名称
        y_lim = y_.get("ylim", None)        # y轴数据限制
        line_type = y_.get("line", "b-")    # 线条类型及颜色,默认为"b-"
        line_label = y_.get("label", None)  # 提示部分线条名称
        title = y_.get("title", None)       # 表格title

        # 如果使用网格,则在网格中逐个添加图片
        if isSubplot:
            plt.subplot(subplot[0], subplot[1], start_index)

        # 开始绘制数据
        plt.plot(x_data, y_data, line_type, label=line_label)

        # 修改y轴显示名称
        plt.ylabel(y_name)

        # x轴名称旋转90°,防止文本过长,导致字符叠加
        plt.xticks(rotation=90)
        
        # 添加图表title
        plt.title(title)
        
        # 如果添加了y轴数据限制,则添加ylim
        if y_lim and isinstance(y_lim, Iterable) and all([isinstance(i, Number) for i in x_lim]):
            plt.ylim(y_lim[0], y_lim[1])
            
        start_index += 1
    
    # 如果添加了x轴数据限制,则添加xlim
    if x_lim and isinstance(x_lim, Iterable) and all([isinstance(i, Number) for i in x_lim]):
        plt.xlim(x_lim[0], x_lim[1])
    
    # 显示图表中线段提示部分
    plt.legend()
    
    # 开始绘制图片
    plt.show()

使用示例

  • 数据准备 仅供参考
# 日期
_date = dict(data=data_0_reversed["日期"],name="日期")

# 粉丝数
_fans= dict(data=list(data_0_reversed["主播粉丝数"]), name="主播粉丝数", line="b-", label="粉丝数", title="主播粉丝增长曲线")

# 直播时长
_anchor_time = dict(data=list(map(lambda x: format_time(x)["hours"], data_0_reversed["直播时长"])), name="直播时长", line="r-", label="直播时长", title="主播直播时长曲线")
  • 调用方式
# 主播直播日期与粉丝增长曲线及每天直播时长曲线
plt_show(x=_date, y=[_fans, _anchor_time], size=(16, 8), subplot=(2,2))

示例图

  • 这里的x轴未做处理,待完善优化
    在这里插入图片描述

写在后面

  • 这里的图片都是每组数据绘制一张表格,另外还有一种多种曲线绘制在一张表格中,其中设计到每组数据的y轴刻度不同,网上找了一段代码,但觉得灵活度不够,所以自己根据代码的思路重构优化了下,详情请看下集。


本文链接: http://www.dtmao.cc/news_show_2000092.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?