暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Matplotlib画图方法总结

细说数据 2021-06-28
2652


简介

Matplotlib是一个综合库,用于在Python中创建静态,动画和交互式可视化。matplotlib是matrix + plot + library的缩写通过 Matplotlib,仅需要几行代码,便可以生成直方图,条形图,散点图等。


画图的两种方法:

pyplot:

matplotlib.pyplot是使matplotlib像MATLAB一样工作的命令样式函数的集合。每个pyplot函数对一个图进行一些更改,例如,创建图,设置横纵坐标、标题等等。

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    x = np.linspace(0, 2, 100)
    plt.plot(x, x, label='linear') # Plot some data on the (implicit) axes.
    plt.plot(x, x**2, label='quadratic') # etc.
    plt.plot(x, x**3, label='cubic')
    plt.xlabel('x label')
    plt.ylabel('y label')
    plt.title("Simple Plot")
    plt.legend()
    plt.show()


    面对对象:

    在使用面向对象的编程接口时候,创建图对象(Figure),创建Axes(一个Figure可以包含一个或者多个Axes,一个Axes可以理解为一个子图,使用一次plot()绘图函数便会创建一个Axes),使用面向对象编程接口有利于我们对于图形绘制的完整控制。

    例子:

      x = np.linspace(0, 2, 100)# Note that even in the OO-style, we use `.pyplot.figure` to create the figure.fig, ax = plt.subplots()  # Create a figure and an axes.ax.plot(x, x, label='linear')  # Plot some data on the axes.ax.plot(x, x**2, label='quadratic')  # Plot more data on the axes...ax.plot(x, x**3, label='cubic')  # ... and some more.ax.set_xlabel('x label')  # Add an x-label to the axes.ax.set_ylabel('y label')  # Add a y-label to the axes.ax.set_title("Simple Plot")  # Add a title to the axes.ax.legend()  # Add a legend.plt.show()


      两种方法能够实现一样的功能,对于简单的单图表绘制,使用plt接口足以满足需要,且操作简单易用。如果是多图表绘制,需要相对复杂的图例配置和其他自定义设置,那么使用面向对象的方法更加合适。

      plt.axes()——fig.add_axes()

      plt.subplot()——fig.add_subplot()

      plt.GridSped()——fig.add_gridspec()

      plt.xlabel()——axes.set_xlabel()

      plt.ylabel()——axes.set_ylabel()

      plt.xlim()——axes.set_xlim()

      plt.ylim()——axes.set_ylim()

      plt.title()——axes.set_title()

      plt.legend()——axes.legend()


      布局:

        matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False, 
        sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

        nrows:可选的,整型,默认为1,网格中有几行子图。

        ncols:可选的,整型,默认为1,网格中有几列子图

        sharex:可选的,默认为False。True或all:所有子图共享x轴,False或none:每个子图的x轴都是独立的,row:每行子图共享一个x轴,col:每列子图共享一个x轴

        sharey:类似于sharex,设置y轴的共享方式。

        squeeze :可选的,布尔型,默认为True,是否压缩返回的Axes数组。

        num:可选的,整型或字符串,默认为None,是matplotlib.pyplot.figure的关键字,用于设置图像数字或标签。

        subplot_kw:可选的,字典类型,包含传递给用于创建子图的调用add_subplot的关键字参数。

        gridspec_kw:可选的,字典类型,包含传递给用于创建子图网格的GridSpec构造函数的关键字参数。

        **fig_kw:所有传递给matplotlib.pyplot.figure调用的额外关键字参数。


        图表类型:

        关于图表的选择,可以看我之前的一篇文章聊聊数据可视化

        plt.plot:折线图或点图


          matplotlib.pyplot.plot(* args,scalex = True,scaley = True
          data = None,** kwargs)

          plt.scatter:散点图


            matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, 
            cmap=None, norm=None, vmin=None, vmax=None, alpha=None,
            linewidths=None, *, edgecolors=None, plotnonfinite=False,
            data=None, **kwargs)

            plt.bar:条形图


              matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, 
              align='center', data=None, **kwargs)

              plt.barh:水平条形图


                matplotlib.pyplot.barh(y, width, height=0.8, left=None, *, 
                align='center', **kwargs)

                plt.hist:直方图


                  matplotlib.pyplot.hist(x, bins=None, range=None, density=False, 
                  weights=None, cumulative=False, bottom=None, histtype='bar',
                  align='mid', orientation='vertical', rwidth=None, log=False,
                  color=None, label=None, stacked=False, *, data=None, **kwargs)

                  plt.pie:饼图

                    matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, 
                    autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,
                    startangle=0, radius=1, counterclock=True, wedgeprops=None,
                    textprops=None, center=0, 0, frame=False, rotatelabels=False, *,
                    normalize=None, data=None)

                    plt.polar:极坐标图

                      matplotlib.pyplot.polar(*args, **kwargs)

                      plt.stackplot:堆叠图

                        matplotlib.pyplot.stackplot(x, *args, labels=(), colors=None,
                        baseline='zero', data=None, **kwargs)

                        plt.stem:茎叶图

                          matplotlib.pyplot.stem(*args, linefmt=None, markerfmt=None, 
                          basefmt=None, bottom=0, label=None, use_line_collection=True,
                          orientation='vertical', data=None)

                          plt.boxplot:箱型图

                            matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, 
                            whis=None, positions=None, widths=None, patch_artist=None,
                            bootstrap=None, usermedians=None, conf_intervals=None,
                            meanline=None, showmeans=None, showcaps=None, showbox=None,
                            showfliers=None, boxprops=None, labels=None, flierprops=None,
                            medianprops=None, meanprops=None, capprops=None, whiskerprops=None,
                            manage_ticks=True, autorange=False, zorder=None, *, data=None)

                            heatmap:热力图

                            plt.hlines:水平横线

                              matplotlib.pyplot.hlines(y, xmin, xmax, colors=None, linestyles='solid', 
                              label='', *, data=None, **kwargs)

                              plt.stairs:阶梯图

                                matplotlib.pyplot.stairs(values, edges=None, *, orientation='vertical', 
                                baseline=0, fill=False, data=None, **kwargs)

                                颜色:

                                matplotlib中的色彩定义主要用到了RGB、RGBA、CMYK、灰色四种模型。RGB是最常见的一种色彩模型,它使用红、绿、蓝三原色的亮度来定量表示颜色,这种模型也称为加色混色模型,是以RGB三色光互相叠加来实现混色的方法。RGBA模型是在RGB模型的基础上加上了Alpha通道,alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%则意味着一个完全不透明的像素(传统的数字图像)。CMYK模型,也被称为印刷四色模型,它彩色印刷时采用的一种套色模型,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。四种标准颜色是:C:Cyan = 青色,又称为天蓝色或是湛蓝,M:Magenta = 品红色,又称为洋红色;Y:Yellow = 黄色;K:blacK=黑色,此处缩写使用最后一个字母K而非开头的B,是为了避免与Blue混淆。灰度模型使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像。每个灰度对象都具有从 0%(白色)到100%(黑色)的亮度值。

                                matplotlib在使用颜色过程有以下9种方法:

                                1、RGB小数模式:3元组(r, g, b),对应R、G、B,每个元素取值要求为0到1之间的小数,例如(0.1, 0.2 ,0.5)。下图例子中画布背景色就是用的这个方法。

                                2、RGBA小数模式:4元组(r, g, b, a),对应R、G、B、A,每个元素取值要求为0到1之间的小数,例如(0.1, 0.2 ,0.5 ,0.4)。

                                3、RGB16进制字符串模式:长度为7的字符串#rrggbb,以#开头后面6位16进数字,每2位一组,对应R、G、B,例如#FFFFFF。下图例子中axes背景颜色就是用的这个方法。

                                4、灰度小数字符串模式:小数字符串,表示灰度,小数取值范围为0到1,例如'0.5',下图例子中标题颜色就是用的这个方法。

                                5、基础颜色字符:长度为1的字符串,取值范围为{'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}对应RGB模型、CMYK模型的基础色和白色。下图例子中横坐标颜色就是用的这个方法。

                                6、X11/CSS4 ("html")模式的色彩名称:字符串,比如"blue"。下图例子中纵坐标颜色就是用的这个方法。

                                7、xkcd色彩名称:以xkcd:开头的字符串,对应xkcd社区定义的色彩映射,例如'xkcd:sky blue'。下图例子中实线图形颜色就是用的这个方法。

                                8、默认色彩循环,Cn彩色:由字符串C和1个非负整数构成。下图例子中虚线图形颜色就是用的这个方法。

                                9、Tableau色彩定义:以tab:开头的字符串,取自Tableau的tab10调色盘。下图例子中坐标轴刻度颜色就是用的这个方法。

                                example:

                                  import matplotlib.pyplot as plt
                                  import numpy as np
                                  t = np.linspace(0.0, 2.0, 201)
                                  s = np.sin(2 * np.pi * t)
                                  # 1) RGB tuple:
                                  fig, ax = plt.subplots(facecolor=(.18, .31, .31))
                                  # 2) hex string:
                                  ax.set_facecolor('#eafff5')
                                  # 3) gray level string:
                                  ax.set_title('Voltage vs. time chart', color='0.7')
                                  # 4) single letter color string
                                  ax.set_xlabel('time (s)', color='c')
                                  # 5) a named color:
                                  ax.set_ylabel('voltage (mV)', color='peachpuff')
                                  # 6) a named xkcd color:
                                  ax.plot(t, s, 'xkcd:crimson')
                                  # 7) Cn notation:
                                  ax.plot(t, .7*s, color='C4', linestyle='--')
                                  # 8) tab notation:
                                  ax.tick_params(labelcolor='tab:orange')
                                  plt.show()




                                  matplotlib内置的颜色可以使用matplotlib.colors 调用,有'BASE_COLORS',

                                  'TABLEAU_COLORS','CSS4_COLORS'及 'XKCD_COLORS'四类。使用matplotlib.colors.类名称可输出颜色号。

                                  基础的颜色8种,b---blue,c---cyan,g---green,k----black,m---magenta r---red,w---white,y----yellow

                                  Tableau色彩有10种tab:blue #1f77b4,tab:orange #ff7f0e,tab:green #2ca02c,tab:red #d62728,tab:purple #9467bd,tab:brown #8c564b,tab:pink #e377c2,tab:gray #7f7f7f,tab:olive #bcbd22,tab:cyan #17becf

                                  CSS4_COLORS共计148种颜色。

                                  XKCD_COLORS色号,共计949种色号,可以参考https://xkcd.com/color/rgb/


                                  图形组件:

                                  也就是一个图形的构成:包含主要图形、标题、横纵坐标、横纵坐标刻度、横纵坐标标题、网格线、图例、标记、文字描述等等,下面这幅图画的很明确。

                                  标记:

                                  处理标记的功能;使用的标记物的功能 plot,scatter和 errorbar。

                                    matplotlib.markers.MarkerStyle(marker=None, fillstyle=None)


                                    线型:

                                    可以使用字符串“ solid”,“ dotted”,“ dashed”或“ dashdot”定义简单的线型。通过提供破折号元组可以实现更精细的控制
                                      set_linestyle(ls)



                                      标题:

                                        matplotlib.pyplot.title(label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs)

                                        label:str, 标题文本
                                        fontdict: dict, 一个字典用来控制标题的字体样式,默认值如下:

                                          {'fontsize': rcParams['axes.titlesize'],
                                          'fontweight': rcParams['axes.titleweight'],
                                          'color': rcParams['axes.titlecolor'],
                                          'verticalalignment': 'baseline',
                                          'horizontalalignment': loc}

                                          loc: str, 标题水平样式可为{'center', 'left', 'right'},分别表示居中,水平居左和居右,默认为水平居中。

                                          pad:float, 标题距轴顶部的偏移量(以磅为单位),默认为None。

                                          y:标题的垂直轴位置,默认为None。

                                          kwargs: 可以设置一些其他的文本属性。


                                          显示中文的方法:

                                            import matplotlib.pyplot as plt
                                            plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
                                            plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)

                                            注解:

                                            有两种方法添加,matplotlib.pyplot.annotate和matplotlib.pyplot.text,前者可以在注解的数据坐标与注解文本之间添加箭头。

                                              matplotlib.pyplot.annotate(text, xy, *args, **kwargs)

                                              text:注解文本。字符串。必备参数。

                                              xy:需要注解的坐标,使用xycoords参数确定的坐标系,浮点数元组,必备参数。

                                              xycoords:设置xy参数所使用的坐标系,可选参数。

                                              xytext:放置注解文本的坐标。浮点数元组。默认值为xy,必备参数。

                                              textcoords:设置xytext所使用的的坐标系。

                                              annotation_clip:当注解超出子图区域后是否绘制,布尔值或None,默认值为None。可选参数。

                                              **kwargs:Text对象的相关属性。

                                                matplotlib.pyplot.text(x, y, s, fontdict=None, withdash=False, **kwargs)

                                                x,y:放置文本的坐标,浮点数,必备参数。

                                                s:文本,text字符串,必备参数。

                                                fontdict:字体属性字典,用于覆盖默认文本的字体属性,默认值为None,应用rcParams中的字体属性,可选参数。

                                                **kwargs:Text对象的相关属性。


                                                坐标轴:


                                                  matplotlib.pyplot.xlabel(xlabel, fontdict=None, labelpad=None,
                                                  *, loc=None, **kwargs)

                                                  xlabel:类型为字符串,即标签的文本。

                                                  labelpad:类型为浮点数,默认值为None,即标签与坐标轴的距离。

                                                  loc:取值范围为{'left', 'center', 'right'},默认值为rcParams["xaxis.labellocation"]('center'),即标签的位置。

                                                  **kwargs:Text 对象关键字属性,用于控制文本的外观属性,如字体、文本颜色等。


                                                  图例:


                                                    matplotlib.pyplot.legend(*args, **kwargs)

                                                    loc:图例位置:

                                                    bbox_to_anchor:用于定位图例位置,2元组或者4元组

                                                    ncol:图例具有的列数

                                                    prop:图例的字体属性

                                                    fontsize:图例的字体大小,{'xx-small','x-small','small','medium','large','x-large','xx-large'}

                                                    labelcolor:图例中文本的颜色

                                                    numpoints:折线图例中标记点的数量

                                                    scatterpoints:散点图例中标记点的数量

                                                    scatteryoffsets:散点图图例条目创建的标记的垂直偏移

                                                    markerscale:图例标记与原始绘制标记的相对大小

                                                    markerfirst:如果为True,则图例标记放置在图例标签的左侧。如果为False,则图例标记位于图例标签的右侧。

                                                    frameon:控制是否应在图例周围绘制框架

                                                    fancybox:控制是否应在构成图例背景的FancyBboxPatch周围启用圆边

                                                    shadow:控制是否在图例后面画一个阴影

                                                    framealpha:控制图例框架的 Alpha 透明度

                                                    facecolor:图例的背景色

                                                    edgecolor:图例的背景色块边缘颜色

                                                    mode:如果将mode设置为"expand",则图例将水平扩展以填充轴区域

                                                    bbox_transform:边界框的转换

                                                    title:标题

                                                    title_fontsize:图例标题的字体大小

                                                    borderpad:图例边框内的小数空格,以字体大小为单位

                                                    labelspacing:图例条目之间的垂直间隔,以字体大小为单位

                                                    handlelength:图例句柄的长度,以字体大小为单位

                                                    handletextpad:图例和文本之间的距离,以字体大小为单位

                                                    borderaxespad:轴与图例边框之间的距离,以字体大小为单位

                                                    columnspacing:列之间的间距,以字体大小为单位

                                                    handler_map:自定义词典将实例或类型映射到图例处理程序


                                                    数学公式

                                                    有自带TeX表达式解析器以r'$开头,也兼容LaTeX,使用plt.rcParams

                                                    https://matplotlib.org/stable/tutorials/text/mathtext.html、


                                                    网格:

                                                      matplotlib.pyplot.grid(b=None, which='major', axis='both', **kwargs)

                                                      b : 布尔值,是否显示网格线。

                                                      which : 网格线显示的尺度,字符串,可选参数,取值范围为{'major', 'minor', 'both'}。

                                                      axis : 选择网格线显示的轴,取值范围为{'both', 'x', 'y'},默认为'both'。

                                                      **kwargs:grid对象的相关属性。


                                                      坐标轴刻度:

                                                        matplotlib.pyplot.locator_params(axis='both', tight=None, **kwargs)

                                                        axis:操作的轴值范围为{'both', 'x', 'y'}, 默认为 'both'

                                                        ax.locator_params(nbins = n),将坐标轴都平均分n等分。


                                                        坐标轴范围:

                                                          matplotlib.pyplot.xlim(*args, **kwargs


                                                          双坐标轴:

                                                            matplotlib.pyplot.twinx(ax=None)

                                                              ax2 = ax1.twinx()


                                                              保存图片:


                                                                matplotlib.pyplot.savefig(*args, **kwargs)
                                                                savefig(fname, dpi=None, facecolor='w', edgecolor='w',
                                                                orientation='portrait', papertype=None, format=None,
                                                                transparent=False, bbox_inches=None, pad_inches=0.1,
                                                                frameon=None, metadata=None)

                                                                fname:路径

                                                                dpi:分辨率,以每英寸点数为单位

                                                                quality:图像质量,等级从1(最差)到95(最佳)

                                                                optimize:优化、仅在format为'jpg'或'jpeg'时适用,否则忽略。

                                                                progressive:图像是否应存储为渐进式JPEG文件

                                                                facecolor:图的面色颜色或'自动'

                                                                edgecolor:图的边缘颜色或'自动'

                                                                orientation:当前仅由postscript后端支持

                                                                papertype:纸张类型

                                                                format:文件格式

                                                                transparent:如果为True,则轴补丁将全部透明;图形补丁也将是透明的

                                                                bbox_inches:边框(以英寸为单位)

                                                                pad_inches:当bbox_inches为“ tight”时,图形周围的填充量

                                                                bbox_extra_artists:计算紧的bbox时将考虑的其他艺术家的列表

                                                                backend:使用非默认后端来渲染文件

                                                                metadata:要存储在图像元数据中的键/值对

                                                                pil_kwargs:保存图形时传递给的其他关键字参数


                                                                绘图风格:

                                                                使用matplotlib画图的时候,除了我们可以针对每一个样式自己定义以外,我们还可以使用系统定义好的样式快速配置。style是pyplot的一个子模块,方便进行风格转换,它里面定义了很多预设风格。

                                                                使用plt.style.available输出所有风格名称,共计26种。

                                                                ['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 

                                                                'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

                                                                  matplotlib.style.use(style)
                                                                  import matplotlib.pyplot as plt
                                                                  print(plt.style.available)



                                                                  matplotlib所绘制的每个组成部分都有对应一个对象,Line2D对象有很多属性可以设置。

                                                                    matplotlib.lines.Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, marker=None,
                                                                    markersize=None, markeredgewidth=None, markeredgecolor=None, markerfacecolor=None,
                                                                    markerfacecoloralt='none', fillstyle=None, antialiased=None, dash_capstyle=None,
                                                                    solid_capstyle=None, dash_joinstyle=None, solid_joinstyle=None, pickradius=5, drawstyle=None,
                                                                    markevery=None, **kwargs)

                                                                    配置文件:

                                                                    matplotlib的配置文件异常强大,能够配置各种属性


                                                                      matplotlib.RcParams(*args, **kwargs)

                                                                      https://matplotlib.org/stable/api/matplotlib_configuration_api.html?highlight=rcparams#matplotlib.RcParams

                                                                      其他:

                                                                      分格图、图中图、工具包和3D、动画功能这里就不介绍了,下次单独讲

                                                                      总结:



                                                                      参考文档:

                                                                      官方文档:https://matplotlib.org/


                                                                      文章转载自细说数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                      评论