【读书笔记】《利用Python进行数据分析》第2版_第九章 绘图与可视化:matplotlib和seaborn入门

关注matplotlib和以它为基础的库

seaborn底层绘图

在Jupyter notebook中使用交互式绘图,执行以下语句

%matplotlib notebook

9.1 简明matplotlib API入门

  • 导入

    import matplotlib.pyplot as plt
    
  • matplotlib的可视化作品库文档是学习高级功能的最佳资源

图片与子图

  • 绘制的图位于图片(Figure)对象中,plt.figure生成一个新的图片

    fig = plt.figure()
    
  • add_subplot创建一个或多个子图(subplot),返回Axes Subplot对象;可以使用这些对象进行画图

    # 图片摆放是2*2的,这是选择四个图形中的第一个
    ax1 = fig.add_subplot(2, 2, 1)
    # 使用对象画图
    _ = ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
    
  • 复杂的图表操作放在单个的notebook单元格中,因为每个单元格运行后,图表被重置

  • 使用子网格图创建图片:plt.subplots

    • 返回包含子图对象的NumPy数组

      fig, axes = plt.subplots(2, 3)
      axes
      """
      array([[<AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>],
             [<AxesSubplot:>, <AxesSubplot:>, <AxesSubplot:>]], dtype=object)
      """
      
    • 数组axes可以像二维数组一样方便地进行索引,axes[0,1]

    • pyplot.subplots选项

      epub_22739904_114

调整子图周围的间距

  • 使用图对象上的subplots_adjust方法更改间距,也可以用作顶层函数

    # wspace控制图片宽度比
    # hspace控制图片高度比
    subplots_adjust(left=None, bottom=None, right=None,top=None, wspace=None, hspace=None)
    

颜色、标记和线类型

  • matplotlib的主函数plot接收带有x和y轴的数组以及一些可选的字符串缩写参数来指明颜色和线类型,也可用十六进制颜色代码来指定颜色

    # 使用绿色破折号绘制x对y的线
    ax.plot(x, y, linestyle='--', color='g')
    # 简化版
    ax.plot(x, y, 'g--')
    
  • 折线图用标记凸显实际数据点

    • 标记可以是样式字符串的一部分

    • 线类型、标记类型必须跟在颜色后面

    • 折线图举例

      from numpy.random import randn
      plt.plot(randn(30).cumsum(), 'ko--')
      # 分开写
      # plot(randn(30).cumsum(), color='k',linestyle='dashed', marker='o')
      
      output
    • 使用drawstyle改变内插新式

      plt.plot(data, 'k-', drawstyle='steps-post',label='steps-post')
      plt.legend(loc='best')
      
      img
  • 使用plt.legend为每条线生成一个用于区分的图例

    无论你在用数据绘图时是否传递了lebel选项,你都必须调用plt.legend (如果你有轴的引用,也可以用ax.legend)来生成图例

刻度、标签和图例

  • 两种修饰图表的方式

    • 程序性的matplotlib.pyplot接口

      • 包含了像xlim(绘图范围)、xticks(刻度位置)和xticklabels(刻度标签)等

      • 使用方法

        • 没有函数参数调用:返回当前的参数值(例如plt.xlim()返回当前的x轴绘图范围)
        • 传入函数参数调用,并设置参数值:(例如plt.xlim([0, 10])会将x轴的范围设置为0到10)

        会在最近的AxesSubplot上生效

        xlim对应子图自身两个方法:ax.get_lim和ax.set_lim

        可以更显式地使用subplot子图方法

    • 面向对象的原生matplotlib API

设置标题、轴标签、刻度和刻度标签

  • 改变轴刻度

    • set_xticks:在数据范围内设定刻度的位置,默认刻度有标签

      ticks = ax.set_xticks([0, 250, 500, 750, 1000])
      
    • set_xticklabels:为标签赋值

      labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],rotation=30, fontsize='small')
      # rotation将x轴的刻度标签旋转30度
      
  • 设置轴名称:set_xlabel()

  • 设置子图标题:set_title()

  • 批量设置绘图属性

    props = {
        'title':'my first matplotlib plot'
        'xlabel':'Stages'
    }
    ax.set(**props)
    

添加图例

  • 添加每个图表时传递label参数

    from numpy.random import randn
    fig = plt.figure(); ax = fig.add_subplot(1, 1, 1)
    ax.plot(randn(1000).cumsum(), 'k', label='one')
    ax.plot(randn(1000).cumsum(), 'k--', label='two')
    ax.plot(randn(1000).cumsum(), 'k.', label='three')
    # 调用ax.legend()或plt.legend自动生成图例
    # loc参数告诉matplotlib在哪里放置图表
    ax.legend(loc='best')
    
    le
  • 取消图例:不要传入label参数或者传入label='_nolegend_'

注释与子图加工

  • 使用text、arrow和annote方法来添加注释和文本

    # 在给定坐标(x,y)上绘制文本
    ax.text(x, y, 'Hello world!',family='monospace', fontsize=10)
    
  • ax.annotate方法可以在指定的x和y坐标上绘制标签

  • matplotlib的图形全集位于matplotlib.patches,但是一些常见图形可在matplotlib.pyplot中找到。

  • 在图表中添加图形

    • 生成patch(补丁)对象shp

    • 调用ax.add_patch (shp)将它加入到子图中

    • 示例代码

      fig = plt.figure(figsize=(12, 6)); ax = fig.add_subplot(1, 1, 1)
      rect = plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3)
      circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
      pgon = plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]],
                         color='g', alpha=0.5)
      ax.add_patch(rect)
      ax.add_patch(circ)
      ax.add_patch(pgon)
      
    • 结果展示

      tutu

将图片保存到文件

  • 使用plt.savefig将图片保存到文件,文件类型根据扩展名推断

    • .pdf:PDF文件

    • .dpi:控制每英寸点数的分辨率

    • bbox_inches:修剪实际图形的空白

      # PNG图片,拥有最小的空白
      plt.savefig('figpath.png', dpi=400, bbox_inches='tight')
      
    • figure.savefig选项

      img
  • savefig可以写到所有文件对象中,如BytesIO()

    from io import BytesIO
    buffer = BytesIO()
    plt.savefig(buffer)
    plot_data = buffer.getvalue()
    

matplotlib设置

matplotlib中的配色方案和默认设置可以通过广泛的全局参数来定制

  • 使用rc方法修改Python编程配置

    • 第一个参数为想要自定义的组件,比如’figure’、‘axes’、‘xtick’、‘ytick’、‘grid’、'legend’等等。

      plt.rc('figure', figsize=(10, 10))
      
    • 使用字典按照关键字参数的序列指定新参数

      font_options = {'family' : 'monospace',
                      'weight' : 'bold',
                      'size'   : 'small'}
      plt.rc('font', **font_options)
      
  • 更深入的定制和参看全量选项

    • 参考matplotlib的设置文件matplotlibrc,该文件位于matplotlib/mpl-data路径
    • 定制文件后放在home路径下并且将文件命名为.matplotlibrc,则每次你使用matplotlib时都会读取该文件。

9.2 使用pandas和seaborn绘图

seaborn简化了常用可视化类型,会修改默认的matplotlib配色方案和绘图样式,提高可读性和美观性

折线图

  • Series和DataFrame都有一个plot属性,用于绘制基本图形,默认是折线图

    • Series的索引会作为x轴,可以传入use_index=False来禁用这个功能
    • DataFrame的plot方法在同一个子图中将每一列绘制为不同的折线,并自动生成图例
    • plot属性包含了不同绘图类型的方法族。例如,df.plot()等价于df.plot.line()
  • Series.plot方法参数

    img
  • DataFrame的plot参数

    img

柱状图

  • plot.bar():垂直柱状图;plot.barh():水平柱状图

    • Series或DataFrame的索引将会被用作x轴刻度(bar)或y轴刻度(barh)

    • 示例

      fig, axes = plt.subplots(2, 1)
      data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
      data.plot.bar(ax=axes[0], color='k', alpha=0.7)
      data.plot.barh(ax=axes[1], color='k', alpha=0.7)
      
      bar
  • 在DataFrame中,柱状图将每一行中的值分组到并排的柱子中的一组

    image-20220404173916617
  • 堆积柱状图:传递stacked=True

使用value_counts: s.value_counts().plot.bar()可以有效地对Series值频率进行可视化

  • 使用seaborn绘制需要聚合和汇总的数据会更简单:seaborn.barplot

    • data参数:可以是pandas的DataFrame
    • hue参数:通过一个额外的分类值将数据分离
  • 设置seaborn外观:

    sns.set(style="whitegrid")
    

直方图和密度图

直方图

  • 定义:直方图是一种条形图,用于给出值频率的离散显示。数据点被分成离散的,均匀间隔的箱,并且绘制每个箱中数据点的数量。
  • 使用Series的plot.hist方法可以绘制直方图

密度图

  • 定义:通过计算可能产生观测数据的连续概率分布估计而产生,密度图也被称为内核密度估计图(KDE)。

  • plot.kde使用传统法定混合法估计绘制密度图

  • distplot方法可以绘制直方图和连续密度估计

    import seaborn as sns
    comp1 = np.random.normal(0, 1, size=200)
    comp2 = np.random.normal(10, 2, size=200)
    values = pd.Series(np.concatenate([comp1, comp2]))
    sns.distplot(values, bins=100, color='k')
    
    nn

散点图或点图

点图或散点图可以用于检验两个一维数据序列之间的关系

  • seaborn的regplot方法 绘制散点图并拟合一条线性回归线

  • seaborn的pairplot方法:支持在对角线上放置每个变量的直方图和密度估计值

    # plot_kws参数能够将配置选项传递给非对角元素上的各个绘图调用
    sns.pairplot(trans_data, diag_kind='kde', plot_kws={'alpha': 0.2})
    
    epub_22739904_143

分面网格和分类数据

使用分面网格是利用多种分组变量对数据进行可视化的方式

  • sns.factorplot():可以简化多种分面绘图

    sns.factorplot(x='day', y='tip_pct', hue='time', col='smoker',kind='bar', data=tips[tips.tip_pct < 1])
    
    epub_22739904_144
  • 可以使用seaborn.FaceGrid创建自己的分面网格图

9.3 其他Python可视化工具

  • 创建web交互式
    • Bokeh(http://bokeh.pydata.org/)
    • Plotly(https://github.com/plotly/plotly.py)
  • 印刷或静态网页
    • matplotlib
    • pandas
    • seaborn
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值