zoukankan      html  css  js  c++  java
  • python-pygal画图

    pygal是个非常简单且功能丰富的py画图包,折线图、柱状图、饼图等常见和不常见的图像都可轻松实现。
    下面将介绍安装方法,解决中文字体问题、Linux系统乱码问题,输出PNG文件问题

    基础操作:

    安装

    pip install pygal
    文档特别详细:
    http://www.pygal.org/en/stable/documentation/index.html
    如下为官网折线图实例:

    line_chart = pygal.Line()
    line_chart.title = 'Browser usage evolution (in %)'
    line_chart.x_labels = map(str, range(2002, 2013))
    line_chart.add('Firefox', [None, None,    0, 16.6,   25,   31, 36.4, 45.5, 46.3, 42.8, 37.1])
    line_chart.add('Chrome',  [None, None, None, None, None, None,    0,  3.9, 10.8, 23.8, 35.3])
    line_chart.add('IE',      [85.8, 84.6, 84.7, 74.5,   66, 58.6, 54.7, 44.8, 36.2, 26.6, 20.1])
    line_chart.add('Others',  [14.2, 15.4, 15.3,  8.9,    9, 10.4,  8.9,  5.8,  6.7,  6.8,  7.5])
    chart.render()  # Return the svg as bytes
    

    image.png

    基础方法

    1. 设置x轴数据:line_chart.x_labels
    2. y轴数据:line_chart.add
    3. 绘图:line_chart.render()
    4. 保存输出:
      bytes:chart.render() # Return the svg as bytes
      svg文件:chart.render_to_file('/tmp/chart.svg')
      png图片:chart.render_to_png('/tmp/chart.png')

    字符乱码问题

    依赖安装

    pygal对输出图片,及中文不够友好,需要引入其他依赖包。

    pip install webencodings
    pip install tinycss2
    pip install defusedxml
    pip install cssselect2
    pip install cairocffi
    pip install CairoSVG
    

    如果是linux环境安装cairo容易失败,可以下载对应的系统包进行安装:
    https://launchpad.net/ubuntu/+source/pycairo/
    我的ubuntu环境下载的:
    python3-cairo_1.16.2-1_amd64.deb
    安装:dpkg -i python3-cairo_1.16.2-1_amd64.deb

    linux系统乱码解决

    linux系统上输出 png会有乱码:
    解决:windows的 C:WindowsFonts 下的微软雅黑.ttf文件copy到 linux的/usr/share/fonts目录

    如下为我的一段代码,将字体改成微软,同时输出png:

    #####################
    # 折线图:
    # 兼容linux 系统 png文字乱码:
    #   windows C:WindowsFonts 下的微软雅黑.ttf文件copy到 linux/usr/share/fonts目录
    #####################
    
    import pygal
    import cairo
    from pygal.style import Style
    from datetime import datetime
    colors_dict = {
            1:'#009688',  #
            2:'#F44336',  #
            3:'#3F51B5',  #
            }
    def draw_line(data, x_label, y_title, title,colors_list):
        colors = []
        for idx in colors_list:
            if idx in colors_dict:
                colors.append(colors_dict[idx])
            else:
                colors.append(colors_dict[1])
        colors = tuple(colors)
        custom_style = Style(
          background='#FFFFFF',
          plot_background='#FFFFFF',
          value_background='rgba(229, 229, 229, 1)',
          foreground='rgba(0, 0, 0, .87)',
          foreground_strong='rgba(0, 0, 0, 1)',
          foreground_subtle='rgba(0, 0, 0, .54)',
    
          # Monospaced font is highly encouraged
          font_family=(
          '"微软雅黑","华文细黑",Arial, Helvetica, sans-serif'),
    
          label_font_family=None,
          major_label_font_family=None,
          value_font_family=None,
          value_label_font_family=None,
          tooltip_font_family=None,
          title_font_family=None,
          legend_font_family=None,
          no_data_font_family=None,
    
          label_font_size=20,
          major_label_font_size=20,
          value_font_size=20,
          value_label_font_size=20,
          tooltip_font_size=14,
          title_font_size=30,
          legend_font_size=16,
          no_data_font_size=64,
    
          # Guide line dash array style
          guide_stroke_dasharray='6,1',
          major_guide_stroke_dasharray='6,1',
    
          opacity='.7',
          opacity_hover='.8',
    
          stroke_opacity='.8',
          stroke_opacity_hover='.9',
    
          transition='150ms',
          colors=colors,
          value_colors=(),
          ci_colors=())
    
        chart = pygal.Line(fill=True, style=custom_style,title=title,y_title=y_title,
                               x_label_rotation=20, show_legend=False,width=1600,print_values=True,
                                print_zeroes=False, print_values_position='top',
                               show_minor_x_labels=False)
        chart.x_labels = x_label
        chart.x_labels_major = x_label[::5]
        for i in data:
            chart.add(i[0], i[1])
        return chart
    
    if __name__=="__main__":
        data = [('IE', [85.8, 84.6, 84.7, 74.5, 66, 58.6, 54.7, 44.8, 36.2, 26.6, 20.1])]
        x_label = ['2019-07-07', '2019-07-08', '2019-07-12', '2019-07-14', '2019-07-15','2019-07-16', '2019-07-17', '2019-07-18', '2019-07-19', '2019-07-20', '2019-07-21']
        print(x_label)
        y_title = "嘿嘿嘿"
        title = "哈哈哈哈"
        save_path = 'test.png'
        chart = draw_line(data, x_label, y_title, title,[1])
        chart.render_to_png(save_path)
    
  • 相关阅读:
    用代理模式 保持用户关闭链接的习惯
    jdbc 链接池的优化
    jdbc 链接池
    xml 操作
    互联网时代常用网站资源整理汇总(一直在完善中)
    快速读懂机器学习(附送详细学习资源)
    快速读懂机器学习(附送详细学习资源)
    常见网络命令之traceroute命令一起其他常用命令
    常见网络命令之traceroute命令一起其他常用命令
    Java案例之士兵作战功能实现
  • 原文地址:https://www.cnblogs.com/i-love-python/p/11438573.html
Copyright © 2011-2022 走看看