DataWhale_Matplotlib_Matplotlib初相识

0.序

(当是完成本节课的小作业啦~)
answer:你在工作或学习中通常何时会用到数据可视化,希望通过可视化达到什么目的?

answer:本人从事交通大数据的数据清洗及分析工作,工作中会需要实时观查数据同步的异常情况,并且需要分析数据质量。故通常将各个监测指标可视化,分区并实时观察数据同步及分布情况。所以我想做一个可视化的面板,实现自动可视化报表监测。将统计结果直观的展现出来,并根据预设的阈值触发报警推送机制。

本文为本次学习任务的Task01,旨在对matplotlib的功能有个最初步的了解和认识,希望能够帮助到有需要的learner!

1.导入三方模块

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import datetime
from datetime import datetime

2.举一个简单的绘图例子

Matplotlib的图像是画在figure上的,可以看作是一块大画布;
每一个figure(画布)又包含了一个或多个axes(一个可以指定坐标系的子画布)

# 实例化一个大画布,以及创建一个子画布
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])

DataWhale_Matplotlib_Matplotlib初相识_第1张图片
若没有指定创建子画布的命令,那么matplotlib会自动创建一个

plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

DataWhale_Matplotlib_Matplotlib初相识_第2张图片

3.Figure的组成

figure包括四个层级-容器(container)
1.figure - 顶层级,用来容纳所有的绘图元素
2.axes - 核心层(子图),一个figure可以由多个子图构成
3.axis - axes的下属层级,用于处理所有坐标轴及网格相关元素
4.tick - axis的下属层级,用于处理所有刻度相关元素
DataWhale_Matplotlib_Matplotlib初相识_第3张图片

3.1创建带有多个子图的画布

# 空白的画布无法进行绘图,可以使用add_subplots方法创建一个或多个子图
## 创建一个画布
fig = plt.figure()

## (2, 2, 1)表示画布是2*2的,且现在选择的是四个中的第一个(序号从1开始)
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)

DataWhale_Matplotlib_Matplotlib初相识_第4张图片
这样就能得到带有三个空白的子图的画布

3.2调整子图周围的间距

默认情况下,matplotlib会在子图的外部和子图之间留出一定的间距(相对于图的高度和宽度来定)
我们可以使用subplots_adjust方法更改间距,也可以用作顶层函数

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
其中,wspace和hspace分别控制图片的宽度和高度的百分比,以用作子图间的间距

# 尝试不断调整间距,一直缩小到0
fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
    for j in range(2):
        axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
## 这里可以自己调试间距
plt.subplots_adjust(wspace=0, hspace=0)

DataWhale_Matplotlib_Matplotlib初相识_第5张图片

4.两种绘图接口

4.1OO模式 - 显示和创建figure和axes

x = np.linspace(0, 2, 100)

numpy.linspace(start, stop, num)
在指定的间隔内返回均匀间隔的数字

# 可以看一下生成的矩阵
print(x)

DataWhale_Matplotlib_Matplotlib初相识_第6张图片

# OO模式创建画布和子图
fig, ax = plt.subplots()

# 曲线y=x
ax.plot(x, x, label='linear')

# 曲线y=x**2
ax.plot(x, x**2, label='quadratic')

# 曲线y=x**3
ax.plot(x, x**3, label='cubic')

# 设置x轴名称
ax.set_xlabel('x label')

# 设置y轴名称
ax.set_ylabel('y label')

# 设置图形名称
ax.set_title('Simple Plot')

# 显示图例
ax.legend()

DataWhale_Matplotlib_Matplotlib初相识_第7张图片

4.2pyplot模式 - 即自动创建画布和子画布

fig, ax = plt.subplots()  
ax.plot(x, x, label='linear')  
ax.plot(x, x**2, label='quadratic')  
ax.plot(x, x**3, label='cubic')  
ax.set_xlabel('x label') 
ax.set_ylabel('y label') 
ax.set_title("Simple Plot")  
ax.legend()

DataWhale_Matplotlib_Matplotlib初相识_第8张图片
可以看到,两者输出的图片并没有什么不同的地方,后者的代码更为简介;
交互绘图的时候使用pyplot模式,会更加方便直观;
非交互绘图使用OO模式,采用多个子图同时展示的时候,这种方式逻辑更加清晰

5.图形拓展设置

5.1颜色、标记和线类型

matplotlib的主函数plot接受带有x和y轴的数组以及一些可选的字符串缩写参数来指明颜色和线类型
很多颜色缩写被用于常用颜色,但是可以通过指定16进制颜色代码来指定任意颜色(例如‘#CECECE’)

plt.plot(np.random.randn(30).cumsum(), 'ko--')

DataWhale_Matplotlib_Matplotlib初相识_第9张图片
对于折线图,后续的点默认是线性内插的,可以通过drawstyle选项进行更改

# 写的显式一些
data = np.random.randn(30).cumsum()
print(data)

DataWhale_Matplotlib_Matplotlib初相识_第10张图片

plt.plot(data, 'k--', label='Default')

# 阶梯式折线图
plt.plot(data, 'k--', drawstyle='steps-post', label='steps-post')

# 选择图例位置自动最佳
plt.legend(loc='best')

DataWhale_Matplotlib_Matplotlib初相识_第11张图片

5.2注释和子图加工

有时,我们需要在图表上绘制自己的注释,而且注释中可能包含文本、箭头和其他图形
我们可以使用text,arrow,annote方法来添加注释和文本

time1 = datetime(2007, 10, 11)
time2 = datetime(2008, 3, 12)
time3 = datetime(2008, 9, 15)
time4 = datetime(2007, 1, 1)
time5 = datetime(2011, 1, 1)

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# 导入金融危机数据源
data = pd.read_csv('spx.csv', index_col=0, parse_dates=True)

spx = data['SPX']
spx.plot(ax=ax, style='k-')

crisis_data = [
    (time1, 'Peak of bull market'),
    (time2, 'Bear Stearns Fails'),
    (time3, 'Lehman Bankruptcy')
]

for date, label in crisis_data:
    # 在指定的点上绘制标签
    ax.annotate(label, xy=(date, spx.asof(date) + 75),
               xytext=(date, spx.asof(date) + 225),
               arrowprops=dict(facecolor='black', headwidth=4, width=2, headlength=4),
               horizontalalignment='left', verticalalignment='top')

# 放大2007-2010年(手动设置图表边界)
ax.set_xlim([time4, time5])
ax.set_ylim([600, 1800])

ax.set_title('Important dates in the 2008-2009 financial crisis')

DataWhale_Matplotlib_Matplotlib初相识_第12张图片
可以看出,我们要关注的点可以通过手动加注释来强调说明

5.3保存生成的图片

使用plt.savefig()方法将图片保存到文件
若将图片保存为SVG,则代码为plt.savesif(‘figpath.svg’)

# 例如,我将上图保存
plt.savefig('fig_financial.svg')

这时候,我工作路径下就会生成一个名为fig_financial的svg文件
DataWhale_Matplotlib_Matplotlib初相识_第13张图片

6.结尾

这期主要是大家了解认识一下matplotlib,它的功能远远不止如此,一些好看的第三方可视化库如seaborn或者pandas自带的绘图都是基于matplotlib实现,后续会带大家一一了解。
希望能对大家有帮助~for the learner!

你可能感兴趣的:(python,数据可视化,可视化)