AI智能
改变未来

【20200815】Matplotlib绘图_03

Matplotlib绘图_03

  • 1.直方图
  • 2.扇形图
  • 3.箱型图
  • 4.雷达图
  • 5.Axes容器
  • 5.1 Axes介绍
  • 5.2 设置x和y轴的最大值与最小值
  • 5.3 添加文本
  • 5.4 绘制双y轴
  • 6.Axis容器
    • 6.1 Axis介绍
    • 6.2 设置x轴和y轴label的位置
    • 6.3 显示子刻度
    • 6.4 多图布局
    • 6.5 自定义布局
  • 总结
  • 1.直方图

    直方图介绍:直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据范围,纵轴表示分布情况。
    直方图特点:绘制连续性的数据,展示一组或者多组数据的分布情况(统计)。

    1. plt.hist(x, bins=None):绘制以x为数值,bins为组数的直方图
      组数 = 极差/组距

    举个例子:某地区连续50年中四月份平均气温数据如下:
    temp_li=[6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]
    根据以上数据,推断该地区四月份平均气温的分布类型。

    from matplotlib import pyplot as pltimport matplotlibfont = {\'family\':\'SimHei\',\'weight\':\'bold\',\'size\':12}matplotlib.rc(\"font\", **font)# plt.figure(figsize=(10,5))temp_li=[6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]# min(temp_li)  # 3.0# max(temp_li)  # 9.7cha = max(temp_li)-min(temp_li)b = 1# bi = round(cha)/b  # 去查一下python当中的四舍五入# bi  # 7.0  TypeError: `bins` must be an integer, a string, or an array# 方法一:int()# 方法二:整除//bi = round(cha)//b  # 去查一下python当中的四舍五入# 求组数 组数=极差/组距plt.hist(temp_li,bins=bi,density=True)  # 注意:bins一定是整数类型,默认为10  density表示频率# 显示标签plt.xlabel(\"区间\")plt.ylabel(\"频数/频率\")plt.title(\"直方图\")plt.show()

    2.扇形图

    扇形图介绍:扇形图,用整个圆表示总数,用圆内各个扇形的大小表示各部分数量占总数的百分数。

    1. plt.pie(x,explode=None,labels=None ):绘制扇形图
      (1)x 扇形数据
      (2)explode 设置某几个分块是否要分离饼图
      (3)labels 每块扇形标签
      (4)autopct 百分比数据标签
      (5)shadow 是否显示阴影
      注意:plt.pie()有三个返回值
      (1)patches 绘制饼图每一块的对象
      (2)texts 文本的列表
      (3)autotexts 百分比的文本列表

    举个例子:将以下frac数据绘制扇形图,并且设置其扇形标签为label
    frac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50]
    label = [’[3,4]’,’(4,5]’,’(5,6]’,’(6,7]’,’(7,8]’,’(8,9]’,’(9,10]’]

    from matplotlib import pyplot as pltimport matplotlibfont = {\'family\':\'SimHei\',\'weight\':\'bold\',\'size\':12}matplotlib.rc(\"font\", **font)frac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50]label = [\'[3,4]\',\'(4,5]\',\'(5,6]\',\'(6,7]\',\'(7,8]\',\'(8,9]\',\'(9,10]\']explodes = (0,0,0.1,0,0,0,0)patches,texts,autotexts = plt.pie(frac,labels=label,autopct=\"%.2f%%\",explode=explodes,shadow=True,textprops={\"size\":15})# print(patches)# print(texts)# print(autotexts)# 设置百分比数值 为白色for autotext in autotexts:autotext.set_color(\"w\")plt.show()

    3.箱型图

    箱型图介绍:箱线图是一种直观简洁的方式去呈现一组数据的分布。 箱线图广泛用于各个数据分析领域,它能非常简单明了地显示一组数据中5个重要数值,并且还能发现一组数据中的存在的异常值

    • 最大值
    • 最小值
    • 中位数
    • 下四分位数(Q1)
    • 上四分位数(Q3)
    1. plt.boxplot():绘制箱型图
      (1)x:需要绘制的箱型图的数据
      (2)notch:是否展示置信区间 默认为False
      (3)sym:代表异常点的符号表示 默认为圆点
      (4)vert:是否是垂直的 默认是True
      (5)whis:上下限系数 默认为1.5
      (6)positions:设置每个盒子的位置
      (7)widths:设置每个盒子的宽度
      (8)labels:每个盒子的label
      (9)meanline和showmean:都为True的时候 会展示平均线

    举个例子:

    import matplotlib.pyplot as pltimport randomplt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 步骤一(替换sans-serif字体)plt.rcParams[\'axes.unicode_minus\'] = False   # 步骤二(解决坐标轴负数的负号显示问题)\"\"\"随机生成100个1-100的数据\"\"\"data = [random.randint(1,100) for i in range(100)]# 添加异常值 -100,500 建议看说明文档data.extend([-100,500])# 均值>中位数  -->数值偏大plt.boxplot(data,sym=\"^\",widths=0.2,meanline=True,showmeans=True)plt.show()

    4.雷达图

    雷达图介绍:雷达图(Radar Chart)又被叫做蜘蛛网图,适用于显示三个或更多的维度的变量的强弱情况。比如某个企业在哪些业务方面的投入等,都可以用雷达图方便的表示。

    1. plt.polar():绘制雷达图
      (1)这个方法的参数跟plt.plot非常的类似,只不过是x轴的坐标点应该为弧度(2PI=360°)。*
      注意:
      (2)因为polar并不会完成线条的闭合绘制,所以我们在绘制的时候需要在theta中和values中在最后多重复添加第0个位置的值,然后在绘制的时候就可以和第1个点进行闭合了。
      (3)polar只是绘制线条,所以如果想要把里面进行颜色填充,那么需要调用fill函数来实现。
      (4)polar默认的圆圈的坐标是角度,如果我们想要改成文字显示,那么可以通过xticks来设置。

    举个例子:

    import matplotlib.pyplot as pltimport numpy as npplt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 步骤一(替换sans-serif字体)plt.rcParams[\'axes.unicode_minus\'] = False   # 步骤二(解决坐标轴负数的负号显示问题)quaters = [\'Q1\',\'Q2\',\'Q3\',\'Q4\',\'Q1\']   # 不是x,x是弧度sales = [40,91,44,90,40]# 求theta 2*PI=360theta = np.linspace(0,np.pi*2,5)  # 创建等差数列 1,2,3,4# 绘制图形plt.polar(theta,sales)# 设置刻度plt.xticks(theta,quaters)plt.fill(theta,sales)plt.show()


    参考链接

    5.Axes容器

    5.1 Axes介绍

    Axes容器是用来创建具体的图形的。比如画曲线,柱状图,都是画在上面。所以之前我们学的使用plt.xx绘制各种图形(比如条形图,直方图,散点图等)都是对Axes的封装。

    5.2 设置x和y轴的最大值与最小值

    set_xlim:设置x轴最大值和最小值
    set_ylim:设置y轴最大值和最小值
    例:

    import matplotlib.pyplot as pltimport randomimport numpy as npplt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 步骤一(替换sans-serif字体)plt.rcParams[\'axes.unicode_minus\'] = False   # 步骤二(解决坐标轴负数的负号显示问题)fig=plt.figure()axl=plt.subplot(111)axl.plot(range(10),range(10))# 给x,y轴设置上下限 为-2到12axl.set_xlim(-2,12)axl.set_ylim(-2,12)plt.show()

    5.3 添加文本

    text():之前添加文本我们用的是annotate,但是如果不是需要做注释,其实还有另外一种更加简单的方式,那就是使用text方法。
    例:

    import matplotlib.pyplot as pltimport randomimport numpy as npplt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 步骤一(替换sans-serif字体)plt.rcParams[\'axes.unicode_minus\'] = False   # 步骤二(解决坐标轴负数的负号显示问题)fig = plt.figure()ax1 = plt.subplot(111)ax1.plot(range(10),range(10),marker=\"o\")# 想在(0,0)的位置显示文本ax1.text(0-0.3,0+0.5,\"(0,0)\")plt.show()

    5.4 绘制双y轴

    步骤
    绘制图1为: ax1
    通过 ax2 = ax1.twinx() 克隆 ax1
    绘制图2位: ax2
    例:

    fig = plt.figure()# 绘制ax1ax1 = plt.subplot(111)ax1.bar(range(10),[random.randint(-10,40) for i in range(10)])ax1.set_ylabel(\"温度\")# 克隆ax1 共享x轴ax2 = ax1.twinx()ax2.plot(range(10),[random.randint(0,200) for i in range(10)],marker=\"o\",color=\"r\")ax2.set_ylabel(\"降水量\")plt.show()

    6.Axis容器

    6.1 Axis介绍

    Axis代表的是x轴或者y轴的对象。包含Tick(刻度)对象,TickLabel刻度文本对象,以及AxisLabel坐标轴文本对象。axis对象有一些方法可以操作刻度和文本等。
    参考链接

    6.2 设置x轴和y轴label的位置

    ax1.yaxis.set_label_coords(x,y):设置y轴label位置

    fig = plt.figure()# 绘制ax1ax1 = plt.subplot(111)ax1.bar(range(10),[random.randint(-10,40) for i in range(10)])ax1.set_ylabel(\"温度\")# 设置y轴label的位置为上方ax1.yaxis.set_label_coords(-0.1,1)

    6.3 显示子刻度

    ax1.minorticks_on():显示子刻度
    注意:自定义刻度格式时,若想显示1.32%类型,则应写\”%.2f%%\”。
    例:

    from matplotlib import tickerfig = plt.figure()# 绘制ax1ax1 = plt.subplot(111)ax1.bar(range(10),[random.randint(-10,40) for i in range(10)])ax1.set_ylabel(\"温度\")# 自定义刻度格式formatter = ticker.FormatStrFormatter(\"%.2f%%\")# 设置刻度格式ax1.yaxis.set_major_formatter(formatter)# 设置子刻度ax1.minorticks_on()plt.show()

    6.4 多图布局

    1. 调整子图间距
      (1)使 fig.subplots_adjust(left=None,bottom=None,right=None,top=None, wspace=None,hspace=None)
      (2)fig.tight_layout(h_pad=None,w_pad=None)

    举个例子:
    不合格的代码:

    import matplotlib.pyplot as pltfig,axes = plt.subplots(2,2)axes[0,0].plot([1,2],[1,2])axes[0,1].plot([1,2],[1,2])axes[1,0].plot([1,2],[1,2])axes[1,1].plot([1,2],[1,2])axes[0,0].set_xlabel(\"x-label\")axes[0,0].set_ylabel(\"y-label\")axes[0,0].set_title(\"title\")axes[0,1].set_xlabel(\"x-label\")axes[0,1].set_ylabel(\"y-label\")axes[0,1].set_title(\"title\")axes[1,0].set_xlabel(\"x-label\")axes[1,0].set_ylabel(\"y-label\")axes[1,0].set_title(\"title\")axes[1,1].set_xlabel(\"x-label\")axes[1,1].set_ylabel(\"y-label\")axes[1,1].set_title(\"title\")plt.show()

    合格的代码:

    def plot_fig(ax):ax.plot([1,2],[1,2])ax.set_xlabel(\"x-label\")ax.set_ylabel(\"y-label\")ax.set_title(\"title\")fig,axes = plt.subplots(2,2)plot_fig(axes[0,0])plot_fig(axes[0,1])plot_fig(axes[1,0])plot_fig(axes[1,1])# wspace:width space  hspace:height space# fig.subplots_adjust(wspace=1,hspace=1)# 自动调整# h_pad:height padding w_pad:width paddingfig.tight_layout(h_pad=4,w_pad=5)plt.show()

    6.5 自定义布局

    • 简单的自定义布局:
    plt.figure()ax1 = plt.subplot(221)ax2 = plt.subplot(223)ax3 = plt.subplot(122)

    • 复杂的自定义布局:
    1. fig.add_gridspec(2,2):创建栅栏模式
    2. fig.add_subplot:添加子图
    fig = plt.figure()gs = fig.add_gridspec(2,2)# [行,列]  [0,0] 取一整行 列取全部fig.add_subplot(gs[0,:])fig.add_subplot(gs[1,0])fig.add_subplot(gs[1,1])


    3.** fig.add_gridspec(2,2,width_ratios=width,height_ratios=height)**:调整子图的比例

    fig = plt.figure()width = (2,1)  # 宽为2:1 0列:1列 的宽度 2:1height = (2,1)  # 高为2:1 0行:1行 的高度 2:1gs = fig.add_gridspec(2,2,width_ratios=width,height_ratios=height)# [行,列]  [0,0] 取一整行 列取全部fig.add_subplot(gs[0,:])fig.add_subplot(gs[1,0])fig.add_subplot(gs[1,1])

    总结

    • plt.hist(x, bins=None):绘制以x为数值,bins为组数的直方图
    • plt.pie(x,explode=None,labels=None ):绘制扇形图
    • plt.boxplot():绘制箱型图
    • plt.polar():绘制雷达图
    • set_xlim:设置x轴最大值和最小值
      set_ylim:设置y轴最大值和最小值
    • text():添加文本
    • ax2 = ax1.twinx():绘制双y轴
    • ax1.yaxis.set_label_coords(x,y):设置y轴label位置
    • ax1.minorticks_on():显示子刻度
    • fig.tight_layout(h_pad=None,w_pad=None):调整子图间距
    • fig.add_gridspec(2,2):创建栅栏模式
    • fig.add_subplot:添加子图
    • fig.add_gridspec(2,2,width_ratios=width,height_ratios=height):调整子图的比例
    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » 【20200815】Matplotlib绘图_03