HeteroCat/HeteroCat-blog

数据可视化基础之matplotlib

Opened this issue · 0 comments

概述

众所周知matplotlib是最大的,最老的,也是最强大的Python可视化库。所以是我们做Python可视化不可忽略的一个库。这里给大家一个学Python可视化的学习路径推荐,我觉得是这样的比较好:首先matplotlib其次seaborn,接着才是boken,pyecharts这些。理由就是matplotlib是基础,seaborn是进阶,pyecharts是出山大概就是这样。OKOK,接下来我们看看matplotlib的具体内容吧,欢迎走进数据之美--数据可视化的magic。

内容

准备工作

allright,allright。所有的操作开始之前你要记得先学好numpy和pandas再来哦。然后导入我们的matplotlib库。

  • 通过Jupyter的魔法命令%matplotlib inline 可以直接在jupyter notebook中展示图表,不需要每个图表都是用plt.show()来展现来~
  • import matplotlib.pyplot as plt
    做完这两步就可以开始我们的画图了。

基础图表

通过plt.subplot()命令来创建FigureAxesaxes是我们绘图的坐标系,figure是我们绘图的窗口,这也是在Matplotlib非常重要的两个概念;

  • Figure:顶层级,所有图表的容器,我们可以理解为窗口(Pyecharm等IDE中是弹出的窗口,Jypyter中为内嵌的窗口),一个Figure中可以包含多个Axes;
  • Axes:坐标系,也就是对应我们画的每一个图表,在Axes我们可以对图表的坐标轴(axis),刻度值(Tick)等进行操作;
  • figure, axes = plt.subplots() # 创建一个包含一个axes的figure
  • 柱形图plt.bar()
  • 条形图plt.barh()
  • 折线图plt.plot()
  • 面积图plt.stackplot()
  • 饼图plt.pie()
  • 散点图plt.scatter()

image.png
大概就是这样子,同时我们要注意如果你用axes做一个坐标系时,plt.bar()就是axes.bar()。当然这些是基础图表没什么好看的,我们可以通过一些参数来调整我们的图表使他好看或者更清楚的表达,参数有很多这里就给大家探索了,所以我们来看点好看的,let’s GO.

image.png

image.png

image.png

南丁格玫瑰图.jpg

历史病毒流行图.jpg

图表元素

  • 修改画布尺寸plt.figure(figsize=(8, 6))
  • 修改中文字体:Matplotlib中遇到中文显示方块的问题,可以通过plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'解决,我们还可以设置的中为字体有SimSun(宋体),SimHei(黑体),Kaiti(楷体)等。
  • 添加图表标题:通过plt.title可以在Matplotlib设置标题,字体样式可以通过fontdict进行设置;通过loc参数可以设置标题显示位置,支持的参数有center(居中),left(靠左),right(靠右)显示。
    • plt.title("销售趋势图", fontdict={'family':'Microsoft YaHei', 'color': 'k', 'size': 15}, loc='left')
  • 添加坐标轴标题:通过plt.xlabel和plt.ylabel可以分别添加x轴和y轴的标题,同样可以通过fontdict进行字体样式的配置,labelpad可以设置坐标轴与标题之间的距离。
    • plt.xlabel("月份", fontdict={'family':'Microsoft YaHei', 'color': 'k', 'size': 12}, labelpad=10)
  • 添加图例:通过plt.legend可以给图表添加图例,图例通常用来说明图表中数据每个系列的数据的;通过plt.plot()绘制折线的时候,需要通过label参数设置该系列数据的名称,后续才能通过plt.legend添加。
  • 添加数据标签:可以通过plt.text对图表添加文本,但是一次只能添加一个点,所以如果要给每个数据项都添加标签的话,我们需要通过for循环来进行。plt.text 有三个重要的参数:x、y 、s,通过x和y确定显示位置,s为需要显示的文本,另外还有va和ha两个参数设置文本的显示位置(靠左、靠右、居中等);
    • for a,b in zip(x, y1):
      plt.text(a, b, b, va='bottom', fontdict={"size":14})
  • 添加网格线:通过可以添加网格线可以方便用户容易看出数据项的大致值,通过上述展示所有数据标签时,可能会让整个图表比较杂乱,我们可以选择使用网格线来展示数据项大致数据值;参数b为True时展示网格线,axis支持x、y、both三个值,分别表示展示纵向网格线,横向网格线和纵向横向都展示。
    • plt.grid(b=True, axis='y', linestyle='--', linewidth=1, color='grey')
  • 坐标轴范围:可以通过plt.ylim和plt.xlim分别对y轴和x轴的坐标范围进行配置。
    • plt.ylim(50, 300)
  • 图表风格:Matplotlib中也预制了很多图表的样式风格,可以通过plt.style.use('default')来设置图表的风格,Matplotlib支持的风格包含26种,不过说实话,我觉得都不咋行挺丑的。

复杂图表

  • 多图plt.subplot(2, 2, 1)或者axes[0][0].bar(x, y),像上面基础图表的第一张图就是我现画的一张多图。

  • 不均匀子图:我们可以通过.add_gridspec()将整个画布划分成不均匀的区域。

    • spec = fig.add_gridspec(nrows=2, ncols=2, width_ratios=[1, 3], height_ratios=[1,2]) 表示将整个画布裁剪为2行2列的区域,width_ratios=[1, 3]表示横向将两列的宽度按照1:3进行裁剪,同理height_ratios=[1,2]表示纵向按照1:2进行裁剪。
    • spec还支持切片的方式,譬如我们将第二行展示为整个条形图;adjust可以调整各区域之间的距离。
    • 添加元素:ax子图同样可以通过set_title、set_xlable等方法添加子图标题,坐标轴标题等,如果需要添加大标题可以通过fig.suptitle()来完成;
  • 双Y轴:当我们多个系列的数据值量级差别太大时,依赖同一个坐标轴来展示通常效果很差,比如需要将销售额和利润同时展示出来;这时候我们可以通过plt.twix()添加次坐标轴。另外需要注意一点,twinx或者twiny方法会返回一个共享x轴或者y轴的新的axes,如果我们通过plt.subplots生成ax后,再绘制第二个折线图时,需要在这个新生成的ax1上绘图。

  • 添加阴影 path_effects=[path_effects.SimpleLineShadow(),path_effects.Normal()]

  • 添加标记:如果我们想给图表某部分内容添加一些注释,我们可以通过plt.annotate()进行添加,其中几个主要参数:

    • xy:需要我们传入数组,如xy=(1,2),用于定位要标记的位置;

    • xycoords:设置xy是通过何种方式去进行定位,比如data表示使用坐标轴刻度值去进行定位;

    • xytext:提示文本要展示的位置;

    • textcoords:同xycoords,设置xytext通过何种何种方式去进行定位

  • colormap 色表:Matplotlib中内置很多配色方法,可以通过代码matplotlib.cm.get_cmap使用;其实Matplotlib中的配色方案我们还可以轻松应用到其他第三方模块中;支持的配色方案可以点击https://matplotlib.org/2.0.2/examples/color/colormaps_reference.html 进行查看

image.png

image.png

image.png

image.png

总结

总的来说,matplotlib很全面很丰富还有很多我没有探究的,值得继续学习,数据可视化之路才刚刚开始,遥看未来我的眼中是斑斓的美,更加绚丽的画,还有蕴含其中的数据之美。