zoukankan      html  css  js  c++  java
  • matplotlib 入门之The Lifecycle of a plot

    matplotlib教程学习笔记

    这篇教程旨在展示如何开始、完善、结束可视化过程。我们将以一些原始的数据为开端,以保存可视化的图片为结尾。在其过程中,我们会展示一些整洁的特性和实用的练习。

    Note

    • figure对象是图片的最终体,可能包含1个或多个Axes对象
    • Axes对象代表独立的plot,请不要把它和axis(坐标轴)混淆

    数据

    
    # sphinx_gallery_thumbnail_number = 10
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.ticker import FuncFormatter
    
    data = {'Barton LLC': 109438.50,
            'Frami, Hills and Schmidt': 103569.59,
            'Fritsch, Russel and Anderson': 112214.71,
            'Jerde-Hilpert': 112591.43,
            'Keeling LLC': 100934.30,
            'Koepp Ltd': 103660.54,
            'Kulas Inc': 137351.96,
            'Trantow-Barrows': 123381.38,
            'White-Trantow': 135841.99,
            'Will LLC': 104437.60}
    group_data = list(data.values())
    group_names = list(data.keys())
    group_mean = np.mean(group_data)
    

    准备开始

    第一步,我们先创建一个figure对象和axes对象,subplots可以替我们完成这项工作。

    fig, ax = plt.subplots()
    

    image.png

    第二步,现在我们已经有了一个Axes实例,可以开始着手在上面“作画”了。

    ax.barh(group_names, group_data) #水平柱状图
    

    image.png

    操控风格

    matplotlib拥有许多的绘图风格,我们可以通过plt.style来查看。

    print(plt.style.available)
    
    ['bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', 'tableau-colorblind10', '_classic_test']
    
    style = plt.style.available
    n = len(style)
    
    fig, axs = plt.subplots( n // 4 + 1, 4, figsize=(10, 20), sharex='all', sharey='all')# n//4+1 * 4 个axes    
    #figsize=(width,height)!!! 像素大小为width*10 * height*10
    count = 0
    try:
        for i in range( n // 4 +1):
            for j in range(4):
                count += 1
                if count == n:
                    raise ValueError
                plt.style.use(style[count])
                axs[i, j].barh(group_names, group_data)
                axs[i, j].set_title(style[count])
    
    
    except ValueError: pass
    
    plt.show()
    

    image.png

    风格控制背景色,线宽等许多特性(虽然我从上图没看出什么来)。

    我错了!!!

    经过实验,发现plt.style.use语句必须在fig对象创建前,而且这个style好像只能统管整个fig,所以我试图一个fig不同Axes不同style的计划就这么失败了。不知道有什么办法能够解救一下。
    image.png

    定制图像

    我已经拥有了比较普通的图像, 我们可以为其添加一些微妙的有趣的变化。比方说,让x轴的标签旋转。

    首先,我们要获得x轴上的标签

    fig, ax = plt.subplots()
    ax.barh(group_names, group_data)
    labels = ax.get_xticklabels()
    

    使用pyplot.setp()函数可以便捷地调整属性

    fig, ax = plt.subplots()
    ax.barh(group_names, group_data)
    labels = ax.get_xticklabels()
    plt.setp(labels, rotation=45, horizontalalignment='right')
    

    image.png

    使用

    plt.rcParams.update({'figure.autolayout': True})
    

    命令matplotlib来自动排版,使得字体不要超出(可能由于后端的问题,测试图片并没有出现这种情况。)

    接下来,我们使用axes.Axes.set()来为Axes添加标题等属性,当然,这项工作也可以由setp()来完成。

    
    fig, ax = plt.subplots()
    ax.barh(group_names, group_data)
    labels = ax.get_xticklabels()
    plt.setp(labels, rotation=45, horizontalalignment='right')
    ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
           title='Company Revenue')
    #plt.setp(ax, xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company', title='Company Revenue')
    

    image.png

    特别注意!!! figsize=(width, height)!!!

    特别注意,figsize属性是widthheight, 与像素的关系是(width10) * (height*10),是10倍关系。

    fig, ax = plt.subplots(figsize=(8, 4))
    ax.barh(group_names, group_data)
    labels = ax.get_xticklabels()
    plt.setp(labels, rotation=45, horizontalalignment='right')
    ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
           title='Company Revenue')
    

    image.png

    格式化标签

    def currency(x, pos):
        """The two args are the value and tick position"""
        if x >= 1e6:
            s = '${:1.1f}M'.format(x*1e-6)
        else:
            s = '${:1.0f}K'.format(x*1e-3)
        return s
    
    formatter = FuncFormatter(currency)  #通过FuncFormatter可以定制标签
    fig, ax = plt.subplots(figsize=(6, 8))
    ax.barh(group_names, group_data)
    labels = ax.get_xticklabels()
    plt.setp(labels, rotation=45, horizontalalignment='right')
    
    ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
           title='Company Revenue')
    ax.xaxis.set_major_formatter(formatter)
    

    image.png

    组合多个可视化对象?

    def currency(x, pos):
        """The two args are the value and tick position"""
        if x >= 1e6:
            s = '${:1.1f}M'.format(x*1e-6)
        else:
            s = '${:1.0f}K'.format(x*1e-3)
        return s
    
    formatter = FuncFormatter(currency)
    
    fig, ax = plt.subplots(figsize=(8   , 8))
    ax.barh(group_names, group_data)
    labels = ax.get_xticklabels()
    plt.setp(labels, rotation=45, horizontalalignment='right')
    
    # Add a vertical line, here we set the style in the function call
    ax.axvline(group_mean, ls='--', color='r')
    
    # Annotate new companies
    for group in [3, 5, 8]:
        ax.text(145000, group, "New Company", fontsize=10,
                verticalalignment="center")
    
    # Now we'll move our title up since it's getting a little cramped
    ax.title.set(y=1.05)
    
    ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
           title='Company Revenue')
    ax.xaxis.set_major_formatter(formatter)
    ax.set_xticks([0, 25e3, 50e3, 75e3, 100e3, 125e3])
    fig.subplots_adjust(left=0.3, right=0.8)  #感觉改了啊,跟例子的不一样了 left,right后面的地方估计直接都是从左往右计了吧
    
    plt.show()
    

    [图片上传中...(image.png-5931a1-1552124449964-0)]

    保存你的图片

    # fig.savefig('sales.png', transparent=False, dpi=80, bbox_inches="tight")
    

    transparent = True, 背景色设置为透明,如果支持的话

    dpi: 控制解析度(dots per square inch)

    bbox_inches="tight" fits the bounds of the figure to our plot.

    支持哪些格式呢

    print(fig.canvas.get_supported_filetypes())
    
    {'ps': 'Postscript', 'eps': 'Encapsulated Postscript', 'pdf': 'Portable Document Format', 'pgf': 'PGF code for LaTeX', 'png': 'Portable Network Graphics', 'raw': 'Raw RGBA bitmap', 'rgba': 'Raw RGBA bitmap', 'svg': 'Scalable Vector Graphics', 'svgz': 'Scalable Vector Graphics', 'jpg': 'Joint Photographic Experts Group', 'jpeg': 'Joint Photographic Experts Group', 'tif': 'Tagged Image File Format', 'tiff': 'Tagged Image File Format'}
    
  • 相关阅读:
    bzoj3721
    [BZOJ3555] [Ctsc2014]企鹅QQ(Hash)
    [POJ3233] Matrix Power Series(矩阵快速幂)
    矩阵运算所满足的定律
    [luoguP1962] 斐波那契数列(矩阵快速幂)
    [luoguP3390]【模板】矩阵快速幂
    【转】关于LIS和一类可以用树状数组优化的DP 预备知识
    [BZOJ1264][AHOI2006]基因匹配Match(DP + 树状数组)
    [luoguP1439] 排列LCS问题(DP + 树状数组)
    蛤蛤蛤(树状数组 | 二分)
  • 原文地址:https://www.cnblogs.com/MTandHJ/p/10804582.html
Copyright © 2011-2022 走看看