matplotlib的一些图的表示方法

matplotlib折线图

  • 折线图可以很直观的反应出数据的变化趋势,反应事物的变化情况

  • 应用场景:适合二维的大数据集,还适合多个二维数据集的比较

  • 模拟股票10分钟的变化趋势

    • 画出股票趋势图
    import numpy as np
    import pandas as pd 
    import matplotlib.pyplot as plt
    
    #1)准备数据
    x = range(1,11) #股票10分钟
    y = np.random.normal(size=10) #正态分布随机生成10个数据
    
    #2)创建画布
    fig = plt.figure(figsize=(16,6),dpi=100) #设置大小,设置dpi
    
    #3)绘制折线图
    plt.plot(x,y)
    
    #4)显示图像
    plt.show() #show方法会释放figure资源
    

    在这里插入图片描述

    • 设置刻度标签,设置刻度值

      plt.xticks(x,**kwargs):x:显示的刻度值

      plt.yticks(y,**kwargs):y:显示的刻度值

      #构造刻度标签
      x_ticks_label = ['10点{}分'.format(i) for i in x]
      
      plt.xticks(x,x_ticks_label,rotation=45) #rotation:将刻度标签旋转多少度
      

      在这里插入图片描述

    • 设置轴标签,标题

      #设置x,y轴标签
      plt.xlabel('时间') 
      plt.ylabel('涨幅')
      
      #设置图像标题
      plt.title('股票10分中的涨幅')
      

      在这里插入图片描述

    • 设置颜色,标记和线类型

      #设置颜色color
      #设置线类型linestyle
      #设置标记marker
      plt.plot(x,y,color='r',linestyle='--',marker='o')
      

      在这里插入图片描述

    • 显示图例

      可能我们在一个绘图区,需要绘制多个图形,多次plot就可以解决

      #在添加一条数据
      y_B = np.random.normal(size=10)
      
      #进行绘制
      #plt.plot(x,y_B,color='b',marker='o')
      
      #添加图例
      #显示图例我们需要先加上label标签
      plt.plot(x,y,color='r',linestyle='--',marker='o',label='A')
      plt.plot(x,y_B,color='b',marker='o',label='B')
      plt.legend(loc='best')
      
      #添加网格显示
      plt.grid(True,linestyle='--',alpha=1) #appha:透明度
      

      在这里插入图片描述

matplotlib饼图

  • 饼图用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于 100%。

    应用场景:分类占比

  • 每个省份投资额占比

    #由于分类过多,截取前5组数据进行绘图
    
    # y 为dataframe列名,或者列名列表,当绘制多列数据,指定subplots=True,绘制在不同的子图中
    # autopct:在图中显示百分比
    #shadow:布尔值,为饼图增加阴影效果
    # explode:为饼图增加破裂效果,值越大,破裂越大
    #startangle:饼图旋转角度,从X轴逆时针旋转
    data[0:5].plot(kind='pie',y='投资额',figsize=(16,9),autopct="%1.2f%%",shadow=True,explode=(0,0,0.3,0,0),startangle=90)
    
    #让饼图保持正圆形
    plt.axis('equal')
    plt.show()
    

    在这里插入图片描述

matplotlib散点图

  • 散点图用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。散点图将序列显示为一组点。值由点在图表中的位置表示。

    应用场景:判断两个变量之间是否存在关联,判断异常值

  • 探究 投资额和住宅投资的关系

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    data = pd.read_csv('d:/test_data/房地产投资金额.csv',engine='python',index_col=0)
    
    data.plot(kind='scatter',x='投资额',y='住宅',figsize=(16,9),color='r')
    #dataframe绘制散点图,需要指定x,y为 dataframe中的列,同样可以给图像添加样式,如指定color,alpha,marker
    plt.show()
    
    #从图中我们可以看出,投资额和住宅成正比关系
    

    在这里插入图片描述

matplotlib箱线图

  • 箱线图是一种直观简洁的方式去呈现一组数据的分布. 因其形状如箱子而得名. 箱线图广泛用于各个数据分析领域. 它能非常简单明了地显示一组数据中5个重要数值, 最大值 (Maximum Value), 最小值 (Minimum Value), 中位数 (Median Value), 下四分位数 (First Quartile), 上四分位数 (Third Quartile). 箱线图还能发现一组数据中的存在的异常值 (Outliers).

    分位数把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。

    在这里插入图片描述

  • 查看投资数据的异常值

    # 
    data.plot(kind='box',figsize=(16,9))
    plt.show()
    
    #高于上边缘的值,为异常值,我们可以用于查看异常值
    

    在这里插入图片描述

matplotlib柱状图

  • 柱状图一种以长方形的长度为变量的表达图形的统计报告图,由一系列高度不等的纵向条纹表示数据分布的情况,用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析

    • 柱状图:柱形图、堆积柱形图、百分比堆积柱形图等。
    • 适用场景
      1. 适合分析分类数据字段、或者连续的数据字段,利用柱子的高度来反映数据的数值差异。、
      2. 适合分析对比组内各项数据
      3. 堆积柱:可以形象的展示一个大分类包含的每个小分类的数据,以及小分类的占比情况,显示的是单个项目与整体之间的关系
      4. 百分比堆积柱形图:矩形高度表示每子项占当前项的百分比
  • 案例

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    data = pd.read_csv('d:/test_data/房地产投资金额.csv',index_col='地区',engine='python')
    data1 = data[0:5]
    data1.plot.bar(figsize=(16,9))
    #data1.plot(kind=bar,figsize=(16,9))
    plt.show()
    
    #在柱状图中,每一行的值进行分组,我们可以看出北京是一组,天津是一组,河北是一组
    

    在这里插入图片描述

    条形图:维度分类较多或维度名称比较长的时候使用横向树状图(条形图)

    data.plot(kind='barh',figsize(16,9))
    plt.show()
    

    在这里插入图片描述

    堆积图:更直观对比整体的数据,可以更清晰的看出各种类别的占比情况

    data.plot(kind='barh',stacked=True,figsize=(16,9)) #传递参数stacked=True来生成堆积树状图
    plt.show()
    

在这里插入图片描述

百分比堆积树状图:展示的占比的情况

data.div(data.sum(1),axis=0).plot(kind='barh',figsize=(16,9),stacked=True)
plt.show()

在这里插入图片描述

matplotlib直方图,密度图

  • 直方图又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。用来整理计量值的观测数据,分析其分布状态的统计方法,用于对总体的分布特征进行推断

    应用场景:表示分布状态,分析数据是否服从正态分布,判断数据是否异常或者孤立

  • 直方图与柱状图的比较:

    • 直方图展示数据的分布,柱状图比较数据的大小。这是直方图与柱状图最根本的区别。直方图表示在一定值的区间中,有多少数据,表现的是数据的分布情况。柱状图表示,每一个数据的值的大小,表现的是值大小的对比

    • 直方图X轴为定量数据,柱状图X轴为分类数据。 直方图的x轴通常是连续排列的,柱状图是分开排列的

      在这里插入图片描述

    • 柱状图是以矩形的长度表示每一组的数据大小,其宽度(表示类别)则是固定的,利于较小的数据集分析

    • 直方图是以矩形的长度表示每一组的频数或频率,宽度则表示各组的组距,因此其高度与宽度均有意义,利于展示大量数据集的统计结果

  • 画直方图一般流程

    • 计算极差(最大值 - 最小值)
    • 设置组距
    • 计算组数(极差/ 组距)(通常对于数据较少的情况,分为5 ~ 12组 )
  • 案例

    #绘制分布直方图
    
    #在这里我们直接分组设置成了25组
    data.plot(kind='hist',bins=25,figsize=(16,9),subplots=True) #subplots:将Dataframe的每一列绘制在子图中
    
    #data.plot(kind='hist',bins=25,figsize=(16,9),subplots=True,density=True) # density绘制直方频率图,面积总和为1
    plt.show()
    

    在这里插入图片描述

  • 密度图用于显示数据在连续区间内的分布状况。这种图表是直方图的变种,使用平滑曲线来绘制数值水平,从而得出更平滑的分布。密度图的峰值显示数值在该时间段内最为高度集中的位置。

    • 密度图其中一个比直方图优胜的地方,是由于它们不受所使用分组数量(典型直方图中所使用的条形)的影响,所以能更好地界定分布形状 。

      #绘制密度曲线图
      data.plot(kind='kde',figsize=(16,9)) 
      

      在这里插入图片描述

面向对象绘图

  • 我们在程序中尽量采用面向对象进行绘图,有利于我们可以绘制多个子图,这里为了大家更方便的理解,给出一般的画图流程

    在这里插入图片描述
    figure ()函数会产生一个指定编号为num的图:

figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80,1英寸等于2.5cm,A4纸是 21*30cm的纸张
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框

这里, figure(1)其实是可以省略的,因为默认情况下plt会自动产生一幅图像。
使用subplot可以在一副图中生成多个子图 ,其参数为:

plt.subplots(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)

subplot可以规划figure划分为n个子图,但每条subplot命令只会创建一个子图

nrows : subplot的行数
ncols : subplot的列数
sharex : 所有subplot应该使用相同的X轴刻度(调节xlim将会影响所有subplot
sharey : 所有subplot应该使用相同的Y轴刻度(调节ylim将会影响所有subplot
subplot_kw : 用于创建各subplot的关键字字典
**fig_kw : 创建figure时的其他关键字,如plt.subplots(2, 2, figsize=(8, 6))

plt. subplot (numrows, numcols,fignum)形式

其中numrows, numcols是行列数, fignum是第几个图,比如(221)则是一个有四个图,该图位于第一个

当numrows * numcols < 10 时,中间的逗号可以省略,因此plt. subplot (211)就相当于plt. subplot(2, 1, 1)。

1.fig, ax = plt.subplots(figsize = (a, b))解析

在matplotlib一般使用plt.figure来设置窗口尺寸。

plt.figure(figsize=(a, b)) 

fig代表绘图窗口(Figure);ax代表这个绘图窗口上的坐标系(axis),一般会继续对ax进行操作。
但是如果使用plt.subplots,就不一样了。

fig, ax = plt.subplots(figsize = (a, b))

fig代表绘图窗口(Figure);ax代表这个绘图窗口上的坐标系(axis),一般会继续对ax进行操作。

fig, ax = plt.subplots()等价于:
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

实例1:

fig, ax = plt.subplots(1, 3, 1)

第一个1参数是子图的行数,第二个3参数是子图的列数
第三个1参数是代表第一个子图,如果想要设置子图的宽度和高度可以在函数内加入figsize值。

实例2:

import numpy as np
import matplotlib.pyplot as plt

# 做1*1个子图,等价于"fig, ax = plt.subplot()",等价于"fig, ax = plt.subplots()"
fig, ax = plt.subplots(1, 1)
ax2 = ax.twinx()  # 让2个子图的x轴一样,同时创建副坐标轴。

# 作y=sin(x)函数
x1 = np.linspace(0, 2 * np.pi, 100)  # 表示在区间[0, 2π]之间取100个点作为横坐标
y1 = np.sin(x1)
ax.plot(x1, y1)

# 作y=cos(x)函数
x2 = np.linspace(0, 2 * np.pi, 100)
y2 = np.cos(x2)
ax2.plot(x2, y2)
plt.show()

在这里插入图片描述

2.plt.subplot()函数解析

plt.subplot()函数用于直接指定划分方式和位置进行绘图。
pylab和pyplot有当前的图形(figure)和当前的轴(axes)的概念,所有的作图命令都是对当前的对象作用。可以通过gca()获得当前的轴(axes),通过gcf()获得当前的图形(figure)。

# 使用plt.subplot来创建小图. plt.subplot(221)表示将整个图像窗口分为2行2列, 当前位置为1.
plt.subplot(221)
# plt.subplot(222)表示将整个图像窗口分为2行2列, 当前位置为2.
plt.subplot(222) # 第一行的右图
# plt.subplot(223)表示将整个图像窗口分为2行2列, 当前位置为3.
plt.subplot(223)
# plt.subplot(224)表示将整个图像窗口分为2行2列, 当前位置为4.
plt.subplot(224)

注意:其中各个参数也可以用逗号,分隔开。第一个参数代表子图的行数;第二个参数代表该行图像的列数; 第三个参数代表每行的第几个图像。

'''如果不指定figure()的轴,figure(1)命令默认会被建立,
同样的如果你不指定subplot(numrows,numcols,fignum)的轴,subplot(111)也会自动建立。'''

import matplotlib.pyplot as plt
plt.figure(1) # 创建第一个画板(figure)
plt.subplot(211) # 第一个画板的第一个子图
plt.plot([1, 2, 3])
plt.subplot(212) # 第一个画板的第二个子图
plt.plot([4, 5, 6])
plt.figure(2) # 创建第二个画板
plt.plot([4, 5, 6]) # 默认子图命令是subplot(111)
plt.figure(1) # 调取画板1; subplot(212)仍然被调用中
plt.subplot(211) # 调用subplot(211)
plt.title('Easy as 1, 2, 3') # 做出211的标题

在这里插入图片描述
在这里插入图片描述

#创建一个包含4个子图对象的figure,默认生成1个
plt.subplots(2,2,figsize=(16,6),dpi=100)
#返回一个元组,里面包含了figure对象,以及4个子图对象
(<Figure size 1600x600 with 4 Axes>,
 array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000001303D43A2B0>,
         <matplotlib.axes._subplots.AxesSubplot object at 0x000001303D4AABA8>],
        [<matplotlib.axes._subplots.AxesSubplot object at 0x000001303D4DA240>,
         <matplotlib.axes._subplots.AxesSubplot object at 0x000001303D5008D0>]],
       dtype=object))

#选取子图进行绘制,选取第二行的第二个进行绘制
#准备数据
fig,axs = plt.subplots(2,2,figsize=(16,6),dpi=100,sharex=True,sharey=True)
x=[1,2,3,4,5]
y=[0.6,0.8,-0.3,0.2,-0.1]
#选取我们所需的子图我们使用数组索引
axs[1,1].plot(x,y)

在这里插入图片描述

从上图我们可以看出,我们子图和子图之间默认会有一定的间距,我们可以使用subplots_adjust对间距进行调整

subplts_adjust(wspace, hspace)

wspace:宽度百分比:

hspace:高度百分比

#调整子图的间距
plt.subplots_adjust(wspace=0,hspace=0) #消除了子图与子图之间的间距

在这里插入图片描述

  • 模拟股票10分钟变化趋势,使用面向对象进行绘图

    使用面向对象绘图有一些基本方法改变:

    set_xticks:设置 x轴的刻度

    set_yticks:设置 y轴的刻度

    set_xticklabes:设置 x轴的刻度标签

    set_yticklabes:设置 y轴的刻度标签

    set_xlabel:设置 x轴标签

    set_ylabe:设置 y轴标签

    set_title:设置标题

    #创建画布,默认生成一个
    fig,ax = plt.subplots(figsize=(16,6),dpi=100)
    
    #面向对象进行画图
    ax.plot(x,y,color='r',linestyle='--',marker='o',label='A')
    ax.plot(x,y_B,color='b',marker='D',label='B')
    
    #显示图例,默认是best
    ax.legend()
    
    #添加网格
    ax.grid(linestyle='--',alpha=1)
    
    #添加标题
    ax.set_title('股票10分中的涨幅')
    
    #设置轴的标签
    ax.set_xlabel('时间')
    ax.set_ylabel('涨幅')
    
    #设置刻度值
    ax.set_xticks(x)
    #设置刻度值标签
    ax.set_xticklabels(x_ticks_label)
    
    #释放figure资源,输出图像
    plt.show()
    

    在这里插入图片描述

  • 绘制子图

#创建一个2*1的画布
fig,axs = plt.subplots(2,1,figsize=(16,6),dpi=100,sharex=True)

#多个子图进行绘图的时候,我们需要选择我们绘图区(axes)
#选择第一个axes
axs[0].plot(x,y,color='r',linestyle='--',marker='o',label='A')
#选择第二个axes
axs[1].plot(x,y_B,color='b',marker='D',label='B')

axs[0].legend()
axs[1].legend()

axs[0].grid(linestyle='--',alpha=1)
axs[1].grid(linestyle='--',alpha=1)

axs[0].set_title('A股票10分中的涨幅')
axs[1].set_title('B股票10分中的涨幅')

axs[0].set_xlabel('时间')
axs[1].set_xlabel('时间')

axs[0].set_ylabel('涨幅')
axs[1].set_ylabel('涨幅')  

#在创建画布的时候,设置了sharex=True,所有的子图共享x轴刻度
axs[0].set_xticks(x)
axs[0].set_xticklabels(x_ticks_label)

plt.show()

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值