Matplotlib绘图指南

1. 添加库

# 所有函数需要用plt.方法
import matplotlib.pyplot as plt

# 如果引入则可以直接使用方法
from pylab import *

测试函数

实现绘制一个简单图像,创建一个基本图表有三个步骤

# 引入 matplotlib 库
import matplotlib.pyplot as plt

# 第一步 设置数据
n = [1,2,3]
# 第二布 绘制图像
plt.plot(n)
# 第三布 显示图表
plt.show()

2. 设置窗口-figure

一个figure就是一个窗口,窗口是用来存放图示的,可以在一个窗口下放置多张图,也可以同时开辟多个窗口

import matplotlib.pyplot as plt
#       函数                          作用
#   figure('标题')                用于创建一个窗口
#   subplot(位置)             表示图标显示的位置

# 设置数据
x = [1,2,3,4]
y = [5,4,3,2]

# 开辟一个新的窗口 名字为 实例
# 这句话下面都是针对这个窗口的
plt.figure('实例')

# 分割成一个1*3的区域 把图放在区域1
plt.subplot(131)
# 绘制直线图
plt.plot(x, y)

# 分割成一个1*3的区域 把图放在区域2
plt.subplot(132)
# 绘制柱状图(直方图)
plt.bar(x, y)

# 分割成一个1*3的区域 把图放在区域3
plt.subplot(133)
# 绘制散点图
plt.scatter(x, y)
plt.show()

figure(dpi=100,figsize=(10,6)) dpi表示大小,figsize控制长宽

axis('equal') 将界面设置成1:1

3. 设置坐标轴

3.1 设置坐标轴名称

在坐标轴生成文字-xlabel/ylabel

  • xlabel('名字',fontsize=大小) x轴的名字字体大小
  • ylabel('y',fontsize=24) y轴的名字字体大小
  • tick_params(axis='both',labelsize=14) x,y同时调整刻度字体大小
import numpy as np
import matplotlib.pyplot as plt
# 显示中文
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

x=np.arange(1,20)
# 坐标轴生成文字
plt.xlabel('示例x轴')
plt.ylabel('示例y轴')
plt.plot(x,x*x)
plt.show()

更好看的字体,空格需要加转义字符\,用一些希腊字符标记

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2, 2, 50)
y1 = -5*x + 3
y2 = x**3
plt.figure(num=222)

plt.plot(x, y2)
plt.plot(x, y1, "y--", linewidth=2.0)
# 更好看的字体,空格需要加转义字符\
plt.title(r'$label\ title$')
plt.xlabel(r'$xlabel$')
plt.ylabel(r'$ylabel$')
plt.show()

3.2显示网格-grid

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x='a','b','c','d'
y=[15,30,45,10]
# 开启网格
plt.grid()
# 也可以设置颜色、线条宽度、线条样式
# plt.grid(color='g',linewidth='1',linestyle='-.')
plt.plot(x,y)
plt.show()

3.3 调整坐标轴刻度

3.3.1 坐标轴刻度的个数

主要通过locator_params实现

同时调整x轴和y轴:plt.locator_params(nbins=20) 只调整x轴:plt.locator_params(‘'x',nbins=20) 只调整y轴:plt.locator_params(‘'y',nbins=20)

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x=np.arange(0,30,1)
plt.plot(x,x)
# x轴和y轴分别显示20个
plt.locator_params(nbins=20)
plt.show()

3.3.2 坐标轴范围

axis/xlim/ylim

  • axis:[0,5,0,10],x从0到5,y从0到10
  • xlim:对应参数有xmin和xmax,分别能调整最大值最小值
  • ylim:同xlim用法

范例:

  1. xlim(-3.0,3.0)/ylim(-3.0,3.0) x,y轴区间单独调整
  2. axis([1,1100,0,1100000]) 同时调整xy的区间
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x=np.arange(0,30,1)
plt.plot(x,x*x)
#显示坐标轴,plt.axis(),4个数字分别代表x轴和y轴的最小坐标,最大坐标
#调整x为10到25
plt.xlim(xmin=10,xmax=25)
plt.plot(x,x*x)
plt.show()

3.3.3 刻度改成字符串

同样可以使得坐标轴显示的不是数字,是字符串

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2, 2, 50)
y1 = -5*x + 3
y2 = x**3
plt.figure(num=222)

plt.plot(x, y2)
plt.plot(x, y1, "y--", linewidth=2.0)

plt.title('use limit')
plt.xlabel('x_label')
plt.ylabel('y_label')
# use limit
plt.xlim((-1.5, 1.5))
plt.ylim((-2, 2))
# use tick
# -1.5 -0.75 0 0.75 1.5
# input : list or array
new_ticks = np.linspace(-1.5, 1.5, 5)
plt.xticks(new_ticks)
# 把对应的tick换成string
plt.yticks([-2, -1.2, -0.2, 1.11, 2],
           ['codes', 'design', 'to', 'like', 'I'])

plt.show()

image-20200316174701724

3.4 添加双坐标轴-twinx

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x=np.arange(1,20)
y1=x*x
y2=np.log(x)
plt.plot(x,y1)
# 添加一个坐标轴,默认0到1
plt.twinx()
plt.plot(x,y2,'r')
plt.show()

输出:

image-20200316162404691

3.5 隐藏坐标轴线

# 隐藏x,y轴
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)

4. 添加标题-title

用于在图标上方生成标题

import numpy as np
import matplotlib.pyplot as plt
# 显示中文
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成函数
x=np.arange(0,10)
# 生成标题
plt.title('这是一个示例标题')
plt.plot(x,x*x)
plt.show()

5. 添加文字-text

这个主要是为了在图片中间坐标位置生成文字

import numpy as np
import matplotlib.pyplot as plt
# 显示中文
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

x=np.arange(-10,11,1)
y=x*x
plt.plot(x,y)
plt.title('这是一个示例标题')
# 添加文字,在坐标位置生成文字
plt.text(-2.5,30,'function y=x*x')
plt.show()

6. 添加注释-annotate

  • xy:为备注的坐标点
  • xytext:备注文字的坐标(默认为xy的位置)
  • arrowprops:在xy和xytext之间绘制一个箭头

注解:会有一个箭头指向需要标注的位置

import numpy as np
import matplotlib.pyplot as plt
# 显示中文
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

x=np.arange(-10,11,1)
y=x*x
plt.title('这是一个示例标题')
plt.plot(x,y)
# 添加注释
plt.annotate('这是一个示例注释',xy=(0,1),xytext=(-2,22),arrowprops={'headwidth':10,'facecolor':'r'})
plt.show()

7. 添加图例-legend

图例就是比如显示不同线条时,比如虚线,曲线等分别表示的意思

import numpy as np
import matplotlib.pyplot as plt
# 显示中文
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

plt.plot(x,x)
plt.plot(x,x*2)
plt.plot(x,x*3)
plt.plot(x,x*4)
# 直接传入legend
plt.legend(['生活','颜值','工作','金钱'])
plt.show()

image-20200316161814668

8. 显示数学公式-mathtext

格式如下: 作为开始和结束符,如\omega $,中间的将解析出公式中的符号

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.title('chenqionghe')
plt.xlim([1,8])
plt.ylim([1,5])
plt.text(2,4,r'$ \alpha \beta \pi \lambda \omega $',size=25)
plt.text(4,4,r'$ \sin(0)=\cos(\frac{\pi}{2}) $',size=25)
plt.text(2,2,r'$ \lim_{x \rightarrow y} \frac{1}{x^3} $',size=25)
plt.text(4,2,r'$ \sqrt[4]{x}=\sqrt{y} $',size=25)
plt.show()

输出:

image-20200316162221034

9. 调整日期自适应-autofmt_xdate

有时候显示日期会重叠在一起,非常不友好,调用plt.gcf().autofmt_xdate(),将自动调整角度

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
x=pd.date_range('2020/01/01',periods=30)
y=np.arange(0,30,1)
plt.plot(x,y)
plt.gcf().autofmt_xdate()
plt.show()

10. 填充区域-fill/fill_beween

fill填充函数区域

import numpy as np
import matplotlib.pyplot as plt
# 显示中文
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline
x=np.linspace(0,5*np.pi,1000)
y1=np.sin(x)
y2=np.sin(2*x)
plt.plot(x,y1)
plt.plot(x,y2)
# 填充
plt.fill(x,y1,'g')
plt.fill(x,y2,'r')
plt.title('这是一个示例标题')
plt.show()

输出:

image-20200316162448443

fill_beween填充函数交叉区域

import numpy as np
import matplotlib.pyplot as plt
# 显示中文
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline
plt.title('这是一个示例标题')
x=np.linspace(0,5*np.pi,1000)
y1=np.sin(x)
y2=np.sin(2*x)
plt.plot(x,y1)
plt.plot(x,y2)
# 填充
plt.fill_between(x,y1,y2,where=y1>y2,interpolate=True)
plt.show()

输出:

image-20200316162610461

11. 画多边形-matplotlib.patche

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mptaches
%matplotlib inline
xy1=np.array([0.2,0.2])
xy2=np.array([0.2,0.8])
xy3=np.array([0.8,0.2])
xy4=np.array([0.8,0.8])
fig,ax=plt.subplots()
#圆形,指定坐标和半径
circle=mptaches.Circle(xy1,0.15)
ax.add_patch(circle)
#长方形
rect=mptaches.Rectangle(xy2,0.2,0.1,color='r')
ax.add_patch(rect)
#多边形
polygon=mptaches.RegularPolygon(xy3,6,0.1,color='g')
ax.add_patch(polygon)
# 椭圆
ellipse=mptaches.Ellipse(xy4,0.4,0.2,color='c')
ax.add_patch(ellipse)
ax.axis('equal')
plt.show()

输出:

image-20200316162704279

12. 切换样式-plt.style.use

matplotlib支持多种样式,可以通过plt.style.use切换样式,例如:plt.style.use('ggplot')输入 plt.style.available 可以查看所有的样式:

import matplotlib.pyplot as plt
plt.style.available

示例代码,ggplot样式:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mptaches
%matplotlib inline
plt.style.use('ggplot')
# 新建4个子图
fig,axes=plt.subplots(2,2)
ax1,ax2,ax3,ax4=axes.ravel()
# 第一个图
x,y=np.random.normal(size=(2,100))
ax1.plot(x,y,'o')
# 第二个图
x=np.arange(0,10)
y=np.arange(0,10)
colors=plt.rcParams['axes.prop_cycle']
length=np.linspace(0,10,len(colors))
for s in length:
    ax2.plot(x,y+s,'-')
# 第三个图
x=np.arange(5)
y1,y2,y3=np.random.randint(1,25,size=(3,5))
width=0.25
ax3.bar(x,y1,width)
ax3.bar(x+width,y2,width)
ax3.bar(x+2*width,y3,width)
# 第四个图
for i,color in enumerate(colors):
    xy=np.random.normal(size=2)
ax4.add_patch(plt.Circle(xy,radius=0.3,color=color['color']))
ax4.axis('equal')
plt.show()

输出:

image-20200316162824629

13. 保存图片

保存图表图片,tight'表示去空白

savefig('.png',bbox_inches='tight')

plt.plot(temp.iloc[-90:,1], color='blue', label='Actual')
plt.plot(temp.iloc[-90:,2],color='green', label='Forecast before completion')
plt.plot(t1.iloc[-90:,0],color='red', label='Forecast after completion')
plt.legend(loc='best',fontsize=9)
plt.title('ST-MVL补全前后预测对比图' , fontsize=16)
# 调整刻度方向
plt.xticks(rotation=0)
# 调整刻度大小
plt.tick_params(labelsize=9)
plt.xlabel('time', fontsize=9)
plt.ylabel('Radial displacement monitoring data', fontsize=10)
plt.grid()  # 生成网格
# 保存图片,dpi是图片像素、bbox_inches保证图片不会发生局部丢失
fig.savefig('./地铁进站流预测2.jpg', bbox_inches = 'tight',dpi=1000)
plt.show()

14. 各类图示

14.1 折线图-plot

折线图可以用来表示数据随着时间变化的趋势,也是用的最多的图示

14.1.1 基本参数介绍

plt.plot(x,y,linewidth=5,color='red',ls='--',label='food')

  • linewidth表示直线的宽度
  • ls='--'表示直线的样式
  • label='food',设置图片的名字,这个属性要搭配,plt.legend()才能显示
  • color:线条颜色,color=’green’
  • linestyle:线条风格,linestyle=’--’
  • marker:标记风格,marker = ‘o’
  • markerfacecolor:标记本身的颜色,markerfacecolor = ‘blue’
  • markersize:标记尺寸,markersize = ‘20’

线条风格

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
plt.plot(x, y)
plt.show()

# df = pd.DataFrame({'x': x, 'y': y})
# sns.lineplot(x="x", y="y", data=df)
# plt.show()

也可以直接用numpy直接生成函数

import matplotlib.pyplot as plt
import numpy as np
# 利用 numpy产生一个-5到5的100个等分点
# 利用 numpy产生一个-5到5的100个等分点
# 一般等分的越多则最终画出的图形就光滑
# 因为这里y其实是通过一个映射函数得到的一个y集合
# 等分越多说明点越多的去表示,则越光滑,反正则有很多棱角
x = np.linspace(-5, 5, 100)
y = x**3
# plot显示
plt.plot(x, y)
# 一定要有这句话,否则不显示
plt.show()

14.1.2 调整颜色-color

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x=np.arange(1,5)
#颜色的几种方式
plt.plot(x,color='g')
plt.plot(x+1,color='0.5')
plt.plot(x+2,color='#FF00FF')
plt.plot(x+3,color=(0.1,0.2,0.3))
plt.show()

14.1.3 切换线条样式-marker

**标记**就是在线条上会有一些形状图案

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x=np.arange(1,5)
plt.plot(x,marker='o')
plt.plot(x+1,marker='>')
plt.plot(x+2,marker='s')
plt.show()

image-20200316162128404

14.2 直方图-hist

直方图是比较常见的视图,它是把横坐标等分成了一定数量的小区间,然后在每个小区间内用矩形条(bars)展示该区间的数值。

a = np.random.randn(100)
s = pd.Series(a)
plt.hist(s)
plt.show()


sns.distplot(s, kde=False)
plt.show()
sns.distplot(s, kde=True)
plt.show()

14.3 垂直条形图-bar

条形图可以帮我们查看类别的特征。在条形图中,长条形的长度表示类别的频数,宽度表示类别。

x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']
y = [5, 4, 8, 12, 7]
plt.bar(x, y)
plt.show()

14.4 水平条形图-barh

x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']
y = [5, 4, 8, 12, 7]
plt.barh(x, y)
plt.show()

14.5 饼图-pie

nums = [25, 37, 33, 37, 6]
labels = ['High-school','Bachelor','Master','Ph.d', 'Others']
plt.pie(x = nums, labels=labels)
plt.show()

14.6 箱线图-boxplot

箱线图由五个数值点组成:最大值 (max)、最小值 (min)、中位数 (median) 和上下四分位数 (Q3, Q1)。可以帮我们分析出数据的差异性、离散程度和异常值等。

# 生成0-1之间的10*4维度数据
data=np.random.normal(size=(10,4)) 
lables = ['A','B','C','D']
# 用Matplotlib画箱线图
plt.boxplot(data,labels=lables)
plt.show()

用Seaborn画箱线图

# 用Seaborn画箱线图
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()

14.7 热力图-heatmap

力图,英文叫 heat map,是一种矩阵表示方法,其中矩阵中的元素值用颜色来代表,不同的颜色代表不同大小的值。通过颜色就能直观地知道某个位置上数值的大小。

flights = sns.load_dataset("flights")
data=flights.pivot('year','month','passengers')
sns.heatmap(data)
plt.show()

14.8 散点图

散点图的英文叫做 scatter plot,它将两个变量的值显示在二维坐标中,非常适合展示两个变量之间的关系。

plt.scatter(x,y,s=2,c=y,cmap = plt.cm.Blues,edgecolor='none')

  • s表示散点大小
  • c表示散点的颜色
  • cmap = plt.cm.Blues表示设置蓝色渐变
  • edgecolor='none'去除轮廓使得图线光滑
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
plt.scatter(x, y,marker='x')
plt.show()

其他

df = pd.DataFrame({'x': x, 'y': y})
sns.jointplot(x="x", y="y", data=df, kind='scatter');
plt.show()

14.9 蜘蛛图

蜘蛛图是一种显示一对多关系的方法,使一个变量相对于另一个变量的显著性是清晰可见。

labels=np.array([u"推进","KDA",u"生存",u"团战",u"发育",u"输出"])
stats=[83, 61, 95, 67, 76, 88]
# 画图数据准备,角度、状态值
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)
stats=np.concatenate((stats,[stats[0]]))
angles=np.concatenate((angles,[angles[0]]))
# 用Matplotlib画蜘蛛图
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)   
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)

ax.set_thetagrids(angles * 180/np.pi, labels)
plt.show()

image-20200316164217360

14.10 二元变量分布

# 两个变量的关系
tips = sns.load_dataset("tips")
tips.head(10)
#散点图
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')
#核密度图
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
#Hexbin图
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex')
plt.show()

14.11 面积图

面积图又称区域图,强调数量随时间而变化的程度,也可用于引起人们对总值趋势的注意。堆积面积图还可以显示部分与整体的关系。折线图和面积图都可以用来帮助我们对趋势进行分析,当数据集有合计关系或者你想要展示局部与整体关系的时候,使用面积图为更好的选择。

df = pd.DataFrame(
np.random.rand(10, 4), 
columns=['a', 'b', 'c', 'd'])

# 堆面积图
df.plot.area()

# 面积图
df.plot.area(stacked=False)

image-20200316164847968

image-20200316164901834

14.12 六边形-hexbin

六边形图将空间中的点聚合成六边形,然后根据六边形内部的值为这些六边形上色。

df = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])
df['b'] = df['b'] + np.arange(1000)

# 关键字参数gridsize;它控制x方向上的六边形数量,默认为100,较大的gridsize意味着更多,更小的bin
df.plot.hexbin(x='a', y='b', gridsize=25)