导入matplotlib库

import matplotlib.pyplot as plt

线图

plt.plot([1,2,3,4,5],
         [1,4,9,16,25],
         '--', c = 'r',linewidth=1)     # 虚线 颜色。 ‘:’ 是点线, 设定线条宽度
plt.xlabel('xlabel',fontsize = 16) # 指定x y轴的标签
plt.ylabel('ylabel',fontsize = 16) # 设定标签的大小

x = np.linspace(-10,10)         # 指定x轴的范围, 并返回一个数组
plt.plot(x, y, linewidth = 3.0) # 设置线条宽度

plt.plot(x,  y,  marker = 'o')   # 显示关键点
Python的matplotlib各种图详解
Python的matplotlib各种图详解
plt.title('title')        # 图的标题
plt.text(0,0, 'text') # 在图上某点写字
plt.grid(True)        # 网格
Python的matplotlib各种图详解

绘制多个图

# 211 表示图是 2 行 1列 第 1 个图
plt.subplot(211)
plt.plot(x, y, color = 'r')

plt.subplot(212)
plt.plot(x, y, color = 'b')
Python的matplotlib各种图详解

柱状图

mean_values = [1,2,3]      # 平均值
variance = [0.2, 0.4, 0.5] # 数据浮动值
bar_label = ['bar1', 'bar2', 'bar3']

x_pos = list(range(len(bar_label)))       # x轴的坐标
plt.bar(x_pos, mean_values,yerr=variance) # 柱状图, yerr设置浮动值
max_y = max(zip(mean_values, variance))
plt.ylim(0, (max_y[0]+max_y[1])*1.2)      # 设置y轴的范围
plt.xticks(x_pos, bar_label)              # 设置x轴的坐标名
Python的matplotlib各种图详解

水平直方图

x1 = np.array([1,2,3])
x2 = np.array([2,2,3])
bar_labels = ['bar1', 'bar2', 'bar3']

fig = plt.figure(figsize = (8,6))   # 设置画布的大小
y_pos = np.arange(len(x1))          


plt.barh(y_pos, x1)                 # 水平直方图
plt.barh(y_pos, -x2)                # 可以向两个方向画

plt.xlim(-max(x2)-1, max(x1)+1)     # 设置坐标轴的范围
plt.xlabel("YYY")
plt.yticks(y_pos, bar_labels)
Python的matplotlib各种图详解




fig, ax = plt.subplots(ncols = 2) # 画布分两列

ax[0].bar(x,y, color = 'red')
ax[1].barh(x,y,color = 'green') 
Python的matplotlib各种图详解
ax[0].axhline(0) # 在 0 的位置加一条线,h横着
ax[1].axvline(0) # v 竖着
Python的matplotlib各种图详解

遍历图,改变特定柱的颜色

fig, ax = plt.subplots()
v = ax.bar(x, y, color = 'lightblue')   # v 是所有柱的集合

for bar, height in zip(v, y): # 遍历条形图
    if height < 0:
        bar.set(color = 'red') # 改变特定柱的颜色
Python的matplotlib各种图详解

多个柱形图画在一起

pos = list(range(len(y1)))
w = 0.2                         # 自定义柱的宽度

plt.bar(pos, y1, w, color = 'g')
plt.bar([p+w for p in pos], y2, w, color = 'b')   # 新图往后一个w 宽度
plt.bar([p+w*2 for p in pos], y3, w, color = 'r')
Python的matplotlib各种图详解

在轴顶标数据

data = range(200, 225, 5)
bar_labels = ['a','b','c','d','e']
fig, ax = plt.subplots()
y_pos = np.arange(len(data))

plt.yticks(y_pos, bar_labels)  # 设置y轴的标刻
bars = ax.barh(y_pos,data)     # 画水平条形图

for b,d in zip(bars,data):    # 表参数
    plt.text(b.get_width(), b.get_y()+b.get_height()/2, '{:.2%}'.format(d/min(data)))

# b.get_width()  永远是横向的宽度,不论水平还是竖直的图
# b.get_height() 永远是条形图的高度,
# b.get_y()      一个柱所在的高度y
# {:.2%}'.format(d/min(data)) 格式化输出百分比
Python的matplotlib各种图详解

根据数据自动生成颜色风格

mean_values = range(10,18)
x_pos = range(len(mean_values))

import matplotlib.colors as col
import matplotlib.cm as cm

# cm.ScalarMappable(min,max,风格) 根据数据自动生成颜色
cmap1 = cm.ScalarMappable(col.Normalize(min(mean_values), max(mean_values), cm.hot))
cmap2 = cm.ScalarMappable(col.Normalize(0,20,cm.hot)) 

# 画图并指定cmap1格式的颜色
plt.bar(x_pos, mean_values, color=cmap1.to_rgba(mean_values))
Python的matplotlib各种图详解

直方图hist展示数据分布情况

import math
x = np.random.normal(0, 1.0, 300)
w = 0.5
# 对数据进行间隔为w的划分
bins = np.arange( math.floor(x.min())-w, math.ceil(x.max()+w), w)

ax = plt.subplot(111)

# 让上边和右边的边框不可见
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# 网格
plt.grid(axis = 'y', linestyle='--')

plt.hist(x, bins) 
# hist 直方图
# x是数据集
# bins 是横分为几条
Python的matplotlib各种图详解

多组数据的分布直方图

data1 = [random.gauss(15,10) for i in range(500)]
data2 = [random.gauss(5,5) for i in range(500)]
bins = np.arange(-50,50,2.5)

plt.hist(data1, bins=bins,label='1',alpha=0.7)
plt.hist(data2, bins = bins, label='2',alpha=0.7)
plt.legend()
Python的matplotlib各种图详解

填充画图

x = np.linspace(0,10,100)
y = np.sin(x)
plt.fill_between(x,y)
Python的matplotlib各种图详解
x = np.linspace(0,10,200)
y1 = 2*x + 1
y2 = 3*x +1.2

fig, ax = plt.subplots()
ax.fill_between(x, y1, y2, color = 'lightblue')  # y1 y2 之间填充
Python的matplotlib各种图详解

不同模式的填充

patterns =('-','+','x','\\','*','o','O','.') # 各种填充样式
fig,ax = plt.subplots()

mean_value = range(1, len(patterns)+1)
x_pos = list(range(len(mean_value)))

bars = ax.bar(x_pos,mean_value, color='lightblue')

for b,p in zip(bars, patterns):
    b.set_hatch(p)                         # 自己设置填充的样式
#b.set_hatch(pattern)
Python的matplotlib各种图详解

盒图

主要三个数据,中位数M,
中位数左边数据的中位数是Q1
中位数右边数据的中位数是Q3
小于 Q1-1.5IQR 或者 大于 Q3+1.5IQR ,被称为离群点
data = [np.random.normal(0, std, 100) for std in range(1,4)]
# for循环,构造了3组符合不同标准差正态分布的数据
# data是list,有3组数据,每组数据都是ndarraay结构,每组100个

fig = plt.figure(figsize = (8,6))

# 画盒图 boxplot
# notch 样式中位数书否收缩
# sym 离群点的表示 's'是方块
# vert 横着还是竖着
bplot = plt.boxplot(data, notch=True,sym='s',vert=True, patch_artist=True)

plt.xticks([y+1 for y in range(len(data))], ['x1','x2','x3'])
plt.xlabel('x',size=16)
plt.title('box', size=16)

# 盒图颜色填充,画图是必须指定patch_artist=True
color = ["pink", "lightblue", "lightgreen"]
for b,c in zip(bplot['boxes'], color):
    b.set_facecolor(c)
Python的matplotlib各种图详解
# 画成黑白的图
for c in bplot.keys():     # 每个盒子有不同组成部分key
    for line in bplot[c]:  # 把这些key都设置黑色
        line.set_color('black')
Python的matplotlib各种图详解

小提琴图violinplot

小提琴图和盒图表达的意义相近
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12,5))
data = [np.random.normal(0,std,100) for std in range(6,10)]

# showmeans-展示平均数   showmedians-展示中位数
axes[0].violinplot(data, showmeans=False, showmedians=False)
axes[0].set_title('violin')
axes[1].boxplot(data, sym = '+')
axes[1].set_title('box')


for ax in axes:
    ax.yaxis.grid(True)# 加上横线
    ax.set_xticks([y+1 for y in range(len(data))]) # 设置y轴刻度
Python的matplotlib各种图详解

设置坐标刻度

fig.axes.get_xaxis().set_visible(False) # x轴的刻度不可见
Python的matplotlib各种图详解

给图像加标签

x = np.arange(10)
for i in range(1,4):
    plt.plot(x, i*x**2, label = 'Group %d' %i, marker='o') 
    # label 每条线写个标签

plt.legend(framealpha = 1) # 标识框,设置透明度
Python的matplotlib各种图详解
fig,ax = plt.subplots()
for i in range(1,4):
    plt.plot(x, i*x**2, label = 'Group %d' %i, marker='o') 
ax.legend(loc='upper center',bbox_to_anchor = (0.5,1.15), ncol=3)
# loc='upper center' 标签框的对齐方式
# bbox_to_anchor = (0.5,1.15)把标签写到图外边
Python的matplotlib各种图详解

散点图

mu_vecl = np.array([0,0])
cov_matl = np.array([[1,0],[0,1]])
X = np.random.multivariate_normal(mu_vecl, cov_matl, 500)
fig = plt.figure(figsize=(8,6))
# ndarray数组才能直接相乘
R = X**2
R_sum = R.sum(axis=1)  # 按行求和

plt.scatter(X[:,0], X[:,1], marker='o', s=20*R_sum, alpha=0.6)
# scatter()画散点图,分别传入第一维和第二维数据
# marker指定点的图形
# s指定点的大小
Python的matplotlib各种图详解

3D图

fig, ax = plt.subplots()
ax = Axes3D(fig) # 把2维的转换成三维

theta = np.linspace(-4*np.pi, 4*np.pi, 100)
z=np.linspace(-2, 2, 100)
r = z**2+1
x = r*np.sin(theta)
y = r*np.cos(theta)

ax.plot(x,y,z)  # 直接传入三个参数
Python的matplotlib各种图详解

三维点图

np.random.seed(1)
def randrange(n, vmin, vmax):
    return (vmax-vmin)*np.random.rand(n)+vmin

fig,ax = plt.subplots()
ax = Axes3D(fig)
n =100

for c,m,zlow,zhigh in [('r','o',-50,-25),('b','x',-30,-5)]:
    x = randrange(n,23,32)
    y = randrange(n,0,100)
    z = randrange(n,zlow,zhigh)
    ax.scatter(x,y,z,c = c, marker = m)
    
ax.view_init(20,0) # 改变三维图的视角
Python的matplotlib各种图详解

三维曲面

fig= plt.figure()
ax = Axes3D(fig)  # 把2维的转换成三维的

x = np.arange(-4,4,0.25)
y = np.arange(-4,4,0.25)

X,Y = np.meshgrid(x,y) #做网格
Z = np.sin(np.sqrt(X**2+Y**2))

# ax.plot_surface() 画一个平面
ax.plot_surface(X,Y,Z, rstride = 1, cstride = 1,cmap = 'rainbow')
ax.contour(X,Y,Z,zdim='z',offset=-2,cmap='rainbow')   # 等高线
ax.set_zlim(-2,2)
Python的matplotlib各种图详解

pie饼图

m = 51324
f = 40123
mp = m/(m+f)
fp = f/(m+f)

labels = ['M',"F"]
color = ['navy','lightblue']

plt.figure(figsize = (8,8))
paches, text, autotext = plt.pie([mp,fp], labels = labels, autopct='%.1f%%', explode=[0,0.05],colors=color)
# autopct= 设置图里数据显示格式
# explode=[0,0.05] 控制缝隙大小
# autotext是饼图里面的字
# text是外面的字

# 设置字体大小颜色
for t in text+autotext:
    t.set_fontsize(20) 
for t in autotext:
    t.set_color('w')
Python的matplotlib各种图详解

子图布局

ax1 = plt.subplot2grid((3,3), (0,0))
ax2 = plt.subplot2grid((3,3), (1,0))
ax3 = plt.subplot2grid((3,3), (0,2), rowspan=3)
ax4 = plt.subplot2grid((3,3), (2,0), colspan=2)
ax5 = plt.subplot2grid((3,3), (0,1), rowspan=2)
Python的matplotlib各种图详解

Simple And Clear