matplotlib入门

2022-11-12 16:37:47 浏览数 (1)

matplotlib入门案
  • Matplotlib历史
    • MATLAB简介:
    • matplotlib简介
    • seaborn简介
    • 画图示例:
    • Matplotlib特定
    • Matplotlib安装
  • 绘图元素
    • 核心概念
    • 基本流程:
  • 基本案例
    • 案例0 快速入门
    • 案例1 绘制正弦曲线
    • 案例2 基于numpy绘制正弦曲线
    • 案例3 设置线,标记样式
    • 案例4 添加图例
    • 案例5 显示注释坐标点
    • 案例6 设置标题与坐标轴
    • 案例7 显示多条线
    • 案例8 添加网格线
    • 案例9 添加网格线
    • 案例10 散点图
    • 案例11 鸢尾花散点图
    • 案例12 垂直条形图
    • 案例13 水平条形图
    • 案例14 分类对比图
    • 案例15 带有纹理的分类条形图
    • 案例16 叠加条形图
    • 案例17 频率分布直方图
    • 案例18 美化的直方图
    • 案例19 饼图
    • 案例20 箱型图
    • 案例21 误差条
    • 案例22 3d图形

Matplotlib历史

MATLAB简介:

MATlAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、量化金融与风险管理、机器人,控制系统等领域。MATLAB在数值计算方面首屈一指,也是使用最广泛的科研绘图软件之一。优点:编程效率高 便于矩阵计算。缺点:循环效率低 封装性不好。

matplotlib简介

Matplotlib 是 Python 的绘图库。 Matplotlib 由 John D. Hunter 在 2002 年开始编写,提供了一个套面向绘图对象编程的 API 接口,能够很轻松地实现各种图像的绘制,并且它可以配合 Python GUI 工具(如 PyQt、Tkinter 等)在应用程序中嵌入图形。同时 Matplotlib 也支持以脚本的形式嵌入到 IPython shell、Jupyter 笔记本、web 应用服务器中使用。它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 初开发的Matplotlib,仅支持绘制2d图形,后来随着版本的不断更新,Matplotlib在二维绘图的基础上,构建了一部分较为实用的3D绘图程序包,通过调用该程序包一些接口可以绘制3D散点图、3D曲面图、3D线框图等

seaborn简介

Seaborn是一种开源的数据可视化工具,它在Matplotlib的基础上进行了更高级的API封装,因此可以进行更复杂的图形设计和输出。Seaborn是Matplotlib的重要补充,可以自主设置在Matplotlib中被默认的各种参数,而且它能高度兼容NumPy与Pandas数据结构以及Scipy与statsmodels等统计模式。 Seaborn是一种开源的数据可视化工具,它在Matplotlib的基础上进行了更高级的API封装,因此可以进行更复杂的图形设计和输出。

画图示例:

Matplotlib特定

官网:https://matplotlib.org/ Matplotlib: Visualization with Python Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python. Matplotlib makes easy things easy and hard things possible.

Create publication quality plots. Make interactive figures that can zoom, pan, update. Customize visual style and layout. Export to many file formats . Embed in JupyterLab and Graphical User Interfaces. Use a rich array of third-party packages built on Matplotlib.

Matplotlib安装

Python 包管理器 pip 安装

代码语言:javascript复制
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install scipy
pip install seaborn
      (pip3 install seaborn -i https://pypi.tuna.tsinghua.edu.cn/simple -U)

Linux安装

代码语言:javascript复制
·sudo apt-get install python-matplotlib
·sudo yum install python-matplotlib     

Jupyter安装

代码语言:javascript复制
! pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

Python 编程环境

代码语言:javascript复制
import matplotlib 
matplotlib.__version__ 
'3.1.1'  

包管理器 pip

代码语言:javascript复制
pip list | grep matplotlib

绘图元素

核心概念

Figure:指整个图形,您可以把它理解成一张画布,它包括了所有的子元素Axes,一组特殊的Artists(如标题,图例,色彩,轴等),以及嵌套的子图;

The whole figure. The Figure keeps track of all the child Axes, a group of ‘special’ Artists (titles, figure legends, colorbars, etc), and even nested subfigures. The easiest way to create a new Figure is with pyplot:

代码语言:javascript复制
fig = plt.figure()  # an empty figure with no Axes
fig, ax = plt.subplots()  # a figure with a single Axes
fig, axs = plt.subplots(2, 2)  # a figure with a 2x2 grid of Axes

Axes:绘制 2D 图像的实际区域,也称为轴域区,或者绘图区;

An Axes is an Artist attached to a Figure that contains a region for plotting data, and usually includes two (or three in the case of 3D) Axis objects (be aware of the difference between Axes and Axis) that provide ticks and tick labels to provide scales for the data in the Axes. Each Axes also has a title (set via set_title()), an x-label (set via set_xlabel()), and a y-label set via set_ylabel()). The Axes class and its member functions are the primary entry point to working with the OOP interface, and have most of the plotting methods defined on them (e.g. ax.plot(), shown above, uses the plot method)

Axis:指坐标系中的垂直轴与水平轴,包含轴的长度大小(图中轴长为 7)、轴标签(指 x 轴,y轴)和刻度标签;

These objects set the scale and limits and generate ticks (the marks on the Axis) and ticklabels (strings labeling the ticks). The location of the ticks is determined by a Locator object and the ticklabel strings are formatted by a Formatter. The combination of the correct Locator and Formatter gives very fine control over the tick locations and labels.

Artist:您在画布上看到的所有元素都属于 Artist 对象,比如文本对象(title、xlabel、ylabel)、Line2D 对象(用于绘制2D图像)等。

Basically, everything visible on the Figure is an Artist (even Figure, Axes, and Axis objects). This includes Text objects, Line2D objects, collections objects, Patch objects, etc. When the Figure is rendered, all of the Artists are drawn to the canvas. Most Artists are tied to an Axes; such an Artist cannot be shared by multiple Axes, or moved from one to another.

Matplotlib由三个不同的层次结构组成:

1)脚本层 Matplotlib结构中的最顶层。我们编写的绘图代码大部分代码都在该层运行,它的主要工作是负责生成图形与坐标系。 2)美工层 Matplotlib结构中的第二层,它提供了绘制图形的元素时的给各种功能,例如,绘制标题、轴标签、坐标刻度等。 3)后端层 Matplotlib结构最底层,它定义了三个基本类,首先是FigureCanvas(图层画布类),它提供了绘图所需的画布,其次是Renderer(绘图操作类),它提供了在画布上进行绘图的各种方法,最后是Event(事件处理类),它提供了用来处理鼠标和键盘事件的方法。

基本流程:

1.导入依赖

代码语言:javascript复制
from matplotlib import pyplot as plt 
import numpy as np 

2.定义x轴和y轴数据

代码语言:javascript复制
x = np.linspace(0,20,200)  #等差数列
y =  0.5*np.cos(2*x)*x 2.5*x  #x相关的函数

3.绘图:

代码语言:javascript复制
plt.plot(x,y,color='r', linestyle= '--')  # plot为点线图,color为颜色,linestyle为线的样式
plt.title('Tittle') # 图标题
plt.xlabel('xlabel') # x轴的标签
plt.xlim(15,20) # x轴的刻度范围
plt.ylim(30,60) # y轴的刻度范围
plt.legend(labels='p',loc = 'upper right') # 显示图例

plt.show() # 

基本案例

案例0 快速入门

代码语言:javascript复制
from matplotlib import pyplot as plt 
import numpy as np 
x = np.linspace(0,20,200)  #等差数列
y =  0.5*np.cos(2*x)*x 2.5*x  #x相关的函数

plt.plot(x,y,color='r', linestyle= '--')  # 
plt.title('Tittle')

plt.plot(x,y,color='g', linestyle= ':')
plt.xlabel('xlabel')

plt.plot(x,y,color='y', linestyle= '-')
plt.xlim(15,20)
plt.ylim(30,60)

plt.plot(x,y,color='b', linestyle= '-.')
plt.legend(labels='p',loc = 'upper right')

plt.show()

案例1 绘制正弦曲线

代码语言:javascript复制
import math
import matplotlib.pyplot as plt

#Generate a sinusoid 正弦曲线
nbSamples = 256
xRange = (-math.pi, math.pi)

x, y = [], []

for n in range(nbSamples):
    ratio = (n   0.5) /nbSamples
    x.append(xRange[0]   (xRange[1] - xRange[0]) * ratio)
    y.append(math.sin(x[-1]))

# Plot the sinuoid
plt.plot(x, y)
plt.show()

案例2 基于numpy绘制正弦曲线

代码语言:javascript复制
import math
import matplotlib.pyplot as plt
import numpy as np

#Generate a sinusoid 正弦曲线
nbSamples  = 256
x = np.linspace(-math.pi, math.pi, num = 256)
y = np.sin(x) # 向量进 向量出 

# Plot the sinuoid
plt.plot(x, y)
plt.show()

案例3 设置线,标记样式

代码语言:javascript复制
import numpy as np 
import matplotlib.pyplot as plt

nbSamples = 128 

x = np.linspace(-np.pi,np.pi,nbSamples)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x,y1,color='g',linewidth=4,linestyle='--')
plt.plot(x,y2,'*',markersize=8,markerfacecolor='r',markeredgecolor='k')
# markerfacecolor填充色 markeredgecolor填充边的颜色

plt.show()

m 紫色 k 黑色 c 青色 y 土黄色 w 白色

案例4 添加图例

图例

代码语言:javascript复制
import numpy as np
import matplotlib.pyplot as plt
nbSamples = 128

x = np.linspace(-np.pi,np.pi,nbSamples)
y1 = np.sin(x)
y2 = np.cos(x)

# $y=sin(x)$表示LaTex公式格式
plt.plot(x,y1,color='g',linewidth=4,linestyle='--',label=r'$y=sin(x)$') 
plt.plot(x,y2,'*',markersize=8,markerfacecolor='r',
         markeredgecolor='k',label=r'$y=cos(x)$')

plt.legend(loc='best') # 
plt.show()

手打添加图例,线的样式

代码语言:javascript复制
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

lines = []
styles = ['-', '--', '-.', ':']
x = np.linspace(0, 10, 1000)

for i in range(4):
    lines  = ax.plot(x, np.sin(x - i * np.pi / 2),
                     styles[i], color='black')
ax.axis('equal')

# specify the lines and labels of the first legend
ax.legend(lines[:2], ['line A', 'line B'],
          loc='upper right', frameon=False)

# Create the second legend and add the artist manually.
from matplotlib.legend import Legend
leg = Legend(ax, lines[2:], ['line C', 'line D'],
             loc='lower right', frameon=False)
ax.add_artist(leg)

plt.show()

案例5 显示注释坐标点

代码语言:javascript复制
import numpy as np
import matplotlib.pyplot as plt 

x = np.arange(0, 10 ,1)
y = 2 * x

for a,b in zip(x,y):
    plt.text(a, b, (a,b),ha = 'center',va = 'bottom',fontsize = 8)

plt.plot(x, y, 'bo-')
plt.show()

案例6 设置标题与坐标轴

代码语言:javascript复制
import numpy as np
import matplotlib.pyplot as plt 

x = np.arange(-5,5,0.05)
y1 = np.sin(x)
y2 = np.cos(x)

plt.figure(figsize = (9, 6), dpi=100) # 放在最上面,出现一次,都是一个新图

# 为在Matplotlib中显示中文,设置特殊字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams["axes.unicode_minus"]=False # 显示负号
plt.title('双曲线')



plt.ylim(-1.2,1.2)
plt.xlim(-6,6)
plt.xticks(ticks  = np.arange(-1.5 * np.pi, 2 * np.pi,0.5 * np.pi),
           labels = ['$-\frac{3}{2}pi$','$-pi$','$-\frac{1}{2}pi$',
                     '0','$\frac{1}{2}pi$','$pi$','$\frac{3}{2}pi$'])
plt.yticks(ticks = [-1,0,1])

plt.xlabel('我是$X$轴')
plt.ylabel('我是$Y$轴')

plt.plot(x,y1,'r-',label='$y_1=sin(x)$')
plt.plot(x,y2,'b:',label='$y_2=cos(x)$')

plt.legend(loc = 'best')

plt.show()

案例7 显示多条线

代码语言:javascript复制
import matplotlib.pyplot as plt
import numpy as np

#0到4区间,以间隔0.2被均匀分割
data = np.arange(0, 4, 0.2)

# 分别使用红色的点划线、蓝色的方块和绿色的三角形来区分这3条曲线
plt.plot(data, data, 'r-.', data, data**2, 'bs', data, data**3, 'g^')

plt.show()

plt.savefig('mult_lines.png',dpi=600)

#输出为eps格式
#plt.savefig('mult_lines.eps',dpi=600)

“EPS是Encapsulated Post Script 的缩写。EPS格式是Illustrator CS5和Photoshop CS5之间可交换的文件格式。”

案例8 添加网格线

代码语言:javascript复制
import matplotlib.pyplot as plt
import numpy as np

#0到4区间,以间隔0.2被均匀分割
data = np.arange(0, 4, 0.2)

# 分别使用红色的点划线、蓝色的方块和绿色的三角形来区分这3条曲线
plt.plot(data, data, 'r-.', data, data**2, 'bs', data, data**3, 'g^')

# which major|minor|both 
plt.grid(b = True, which='both') 

#plt.savefig('mult_lines-grid.png',dpi=600)

plt.show()

案例9 添加网格线

代码语言:javascript复制
import matplotlib.pyplot as plt
import numpy as np

def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)

t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)

#第一种添加子图的方法
fig = plt.figure()
axis = fig.add_subplot(211)
#plt.subplot(211)
axis.grid(True)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k') # b蓝色 o标记为圆点

#第二种添加子图的方法
plt.subplot(2,1,2)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
plt.savefig('sub-plots.jpg',dpi=600)
plt.show()

备注: Figure是画布,如fig = plt.figure() Subplot:是整齐摆放的子图 Axes:是不规则摆放的子图,Axes是轴axis的复数,可以理解为多轴成图

代码语言:javascript复制
import matplotlib.pyplot as plt
fig = plt.figure()
plt.show()

提示如下:

代码语言:javascript复制
<Figure size 432x288 with 0 Axes>

添加子图

代码语言:javascript复制
import matplotlib.pyplot as plt
fig,axes_lst = plt.subplots(2,2)

x = np.linspace(0,2*np.pi , 400)
y = np.sin(x**2)

axes_lst[1,1].plot(x,y) # 指定子图绘图

plt.show()

输出如下:

用axes绘图:

代码语言:javascript复制
import matplotlib.pyplot as plt

x = np.linspace(0,2*np.pi , 400)
y = np.sin(x**2)

fig = plt.figure()

left1,bottom1,width1,height1 = 0.1,0.1,0.8,0.8
# 在画布上添加第一个子图
axes_1 = fig.add_axes([left1,bottom1,width1,height1])
axes_1.scatter(x,y)
axes_1.set_xlabel("x")
axes_1.set_ylabel("y")
axes_1.set_title("title")

left2,bottom2,width2,height2 = 0.6,0.6,0.25,0.25
# 在画布上添加第一个子图
axes_2 = fig.add_axes([left2,bottom2,width2,height2])
axes_2.plot(x,y)
axes_2.set_title("title inside")

plt.show()

add_axes相比add_subplot更灵活,

代码语言:javascript复制
import matplotlib.pyplot as plt 
import numpy as np

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

fig = plt.figure() 

axes_1 = fig.add_axes([ 0.1, 0.1, 0.5, 0.5])
axes_2 = fig.add_axes([0.2, 0.2, 0.5, 0.5])
axes_3 = fig.add_axes([0.3, 0.3, 0.5, 0.5])
axes_4 = fig.add_axes([0.4, 0.4, 0.5, 0.5])
axes_4.plot(x, y)

plt.show()

案例10 散点图

代码语言:javascript复制
import matplotlib.pyplot as plt
import numpy as np

#产生50对服从正态分布的样本点
nbPointers = 50
x = np.random.standard_normal(nbPointers)
y = np.random.standard_normal(nbPointers)

# 固定种子数,以便实验结果具有可重复性
np.random.seed(19680801)
colors = np.random.rand(nbPointers)

area = (30 * np.random.rand(nbPointers))**2 
# s就是plot函数中的markersize,本例中是一个随机的圆,
plt.scatter(x, y, s = area, c = colors, alpha = 0.5) 

plt.show()

案例11 鸢尾花散点图

代码语言:javascript复制
import matplotlib.pyplot as plt
import numpy as np
#读取数据
data = []
# import os 
# print(os.getcwd(),)

with open('./chap08-matplotlib/范例8-11/iris.csv','r') as file :
    lines = file.readlines() #读取数据行的数据
    for line in lines:        #对于每行数据进行分析
        temp = line.split(',')
        data.append(temp)

#转换为Numpy数组,方便后续处理
data_np = np.array(data)
#不读取最后一列,并将数值部分转换为浮点数
data_np = np.array(data_np[:,:-1]).astype(float)

#特征名称
feature_name = ['sepal length','sepal width','petal length','petal width']
#绘制figure,3x2个子图,figure大小为(20,10)
fig,axes = plt.subplots(3,2,figsize=(16,9))
# 为在Matplotlib中显示中文,设置特殊字体
plt.rcParams['font.sans-serif']=['SimHei']
#设置总标题
fig.suptitle('鸢尾花散点图',fontsize=25)

#获取不同的特征组合,两两组合绘制散点图。
i = 0
for x in range(data_np.shape[1]):
    for y in range(x   1,data_np.shape[1]):
        X = data_np[:,x]
        Y = data_np[:,y]
        axes[i%3][i%2].scatter(X[:50],Y[:50],
                               marker='x',c='b',label='setosa')
        axes[i%3][i%2].scatter(X[50:100],Y[50:100],
                               marker='o',c='r',label='versicolor')
        axes[i%3][i%2].scatter(X[100:],Y[100:],
                               marker='*',c='g',label='virginica')
        axes[i%3][i%2].set_xlabel(feature_name[x],fontsize = 10)
        axes[i%3][i%2].set_ylabel(feature_name[y],fontsize = 10)
        axes[i%3][i%2].legend(loc='best')
        i  = 1

plt.show()

案例12 垂直条形图

代码语言:javascript复制
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams["axes.unicode_minus"]=False # 显示负号

objects = ('Python', 'C  ', 'Java', 'Perl', 'Scala', 'Lisp')
y_pos = np.arange(len(objects))
performance = [10,8,6,4,2,1]

plt.bar(y_pos, performance, align='center', alpha=0.5)
plt.xticks(y_pos, objects)
plt.ylabel('用户量')
plt.title('数据分析程序语言使用分布情况')

plt.show()
代码语言:javascript复制
bar(left,height,width=0.8,bottom=None,align='center',data=None,kwargs)

案例13 水平条形图

代码语言:javascript复制
plt.barh(left,height,width=0.8,bottom=None,align='center',data=None,kwargs)

代码:

代码语言:javascript复制
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams["axes.unicode_minus"]=False # 显示负号

objects = ('Python', 'C  ', 'Java', 'Perl', 'Scala', 'Lisp')
y_pos = np.arange(len(objects))
performance = [10,8,6,4,2,1]

#修改:填充色为黑色,融合标签标签在参数中
plt.barh(y_pos, performance, align='center', alpha = 0.5, color = 'k', 
        tick_label = objects)
#修改X轴的标题
plt.xlabel('用户量')
plt.title('数据分析程序语言使用分布情况')

案例14 分类对比图

代码语言:javascript复制
import numpy as np
import matplotlib.pyplot as plt
#设置字体以便支持中文
plt.rcParams['font.sans-serif']=['SimHei']

# 用于绘制图形的数据
n_groups = 4
means_frank = (90, 55, 40, 65)
means_guido = (85, 62, 54, 20)

# 创建图形
fig, ax = plt.subplots()

#定义条形图在横坐标上的分类位置
index = np.arange(n_groups)

bar_width = 0.35
opacity = 0.8
#画第一个条形图
rects1 = plt.bar(index,      #定义第一个条形图的X坐标信息
                 means_frank, #定义第一个条形图的Y轴信息
                 bar_width,   #定义条形图的宽度
                 alpha = opacity,    #定义图形透明度
                 color ='b',      #定义图形颜色为蓝色(blue)
                 label = '张三')    #定义第一个条形图的标签信息
#画第二个条形图
rects2 = plt.bar(
                 # index, # 与第一个条形图在X周上无缝“肩并肩”
                 index  bar_width, # 与第一个条形图并列
                 # bottom = means_frank,  如果取消注释本配置,该条形图的起始位置会位于means_frank之上
                 means_guido, 
                 bar_width,
                 alpha = opacity,
                 color = 'g',       #定义第二个图形演示为绿色(green)
                 label = '李四') #定义第二个条形图的标签信息

plt.xlabel('课程')
plt.ylabel('分数')
plt.title('分数对比图')
plt.xticks(index   bar_width, ('A', 'B', 'C', 'D'))
plt.legend()
plt.show()

案例15 带有纹理的分类条形图

代码语言:javascript复制
import numpy as np
import matplotlib.pyplot as plt
#设置字体以便支持中文
plt.rcParams['font.sans-serif']=['SimHei']

# 用于绘制图形的数据
n_groups = 4
means_frank = (90, 55, 40, 65)
means_guido = (85, 62, 54, 20)

# 创建图形
fig, ax = plt.subplots()

#定义条形图在横坐标上的分类位置
index = np.arange(n_groups)

bar_width = 0.35
opacity = 0.8

#画第一个条形图
rects1 = plt.bar(index,      #定义第一个条形图的X坐标信息
                 means_frank, #定义第一个条形图的Y轴信息
                 bar_width,   #定义条形图的宽度
                 alpha = opacity,    #定义图形透明度
                 color="w",edgecolor="k",
                 hatch='.....', 
                 label = '张三')    #定义第一个条形图的标签信息
# hatch可取 /  | -   x o O . * ,越多约密集
#画第二个条形图
rects2 = plt.bar(index   bar_width, # 与第一个条形图在X周上无缝“肩并肩”
                 means_guido, 
                 bar_width,
                 alpha = opacity,
                 color="w",edgecolor="k",
                 hatch='\\',
                 label = '李四') #定义第二个条形图的标签信息

plt.xlabel('课程')
plt.ylabel('分数')
plt.title('分数对比图')
plt.xticks(index   bar_width, ('A', 'B', 'C', 'D'))
plt.legend()
plt.show()

案例16 叠加条形图

代码语言:javascript复制
#叠加
import numpy as np
import matplotlib.pyplot as plt
#设置字体以便支持中文
plt.rcParams['font.sans-serif']=['SimHei']

# 用于绘制图形的数据
n_groups = 4
means_frank = (90, 55, 40, 65)
means_guido = (85, 62, 54, 20)

# 创建图形
fig, ax = plt.subplots()

#定义条形图在横坐标上的分类位置
index = np.arange(n_groups)

bar_width = 0.35
opacity = 0.8
#画第一个条形图
rects1 = plt.bar(index,      #定义第一个条形图的X坐标信息
                 means_frank, #定义第一个条形图的Y轴信息
                 bar_width,   #定义条形图的宽度
                 alpha = opacity,    #定义图形透明度
                 color="w",edgecolor="k",
                 hatch='.....',
                 label = '张三')    #定义第一个条形图的标签信息
#画第二个条形图
rects2 = plt.bar(index, # 与第一个条形图在X周上无缝“肩并肩”
                means_guido, 
                 bar_width,
                 bottom = means_frank, # 表示堆叠
                alpha = opacity,
                 color="w",edgecolor="k",
                 hatch=r'\\',
                label = '李四') #定义第二个条形图的标签信息

plt.xlabel('课程')
plt.ylabel('分数')
plt.title('分数对比图')
plt.xticks(index, ('A', 'B', 'C', 'D'))
plt.legend()
plt.show()

案例17 频率分布直方图

代码语言:javascript复制
import numpy as np 
import matplotlib.pyplot as plt 

mu = 100
sigma = 15
x = mu   sigma * np.random.randn(200)
num_bins = 25
plt.figure(figsize=(9, 6), dpi=100)

n,bins,patches = plt.hist(x, num_bins, 
                          color="w", edgecolor="k",
                          hatch=r'ooo',
                          density = 1,
                          label = '频率',
                          histtype  = 'barstacked'
                          )

y = ((1 / (np.sqrt(2 * np.pi) * sigma)) *
     np.exp(-0.5 * (1 / sigma * (bins - mu))**2))
 
plt.plot(bins, y, '--',label='概率密度函数')
plt.rcParams['font.sans-serif']=['SimHei']
plt.xlabel('聪明度')
plt.ylabel('概率密度')
plt.title('IQ直方图:$mu=100$,$sigma=15$')

plt.legend()
plt.show()   

np.random.randn(200)表示生成期望为100,标准差为15的200个数值,num_bins表示划分的组数。

matplotlib.pyplot.hist( x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype=u’bar’, align=u’mid’, orientation=u’vertical’, rwidth=None, log=False, color=None, label=None, stacked=False, hold=None, **kwargs)

常用参数解释: x: 作直方图所要用的数据,必须是一维数组;多维数组可以先进行扁平化再作图;必选参数; bins: 直方图的柱数,即要分的组数,默认为10; range:元组(tuple)或None;剔除较大和较小的离群值,给出全局范围;如果为None,则默认为(x.min(), x.max());即x轴的范围; density:布尔值。如果为true,则返回的元组的第一个参数n将为频率而非默认的频数; weights:与x形状相同的权重数组;将x中的每个元素乘以对应权重值再计数;如果normed或density取值为True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图; cumulative:布尔值;如果为True,则计算累计频数;如果normed或density取值为True,则计算累计频率; bottom:数组,标量值或None;每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子;即直方图上下便宜距离; histtype:{‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’};'bar’是传统的条形直方图;'barstacked’是堆叠的条形直方图;'step’是未填充的条形直方图,只有外边框;‘stepfilled’是有填充的直方图;当histtype取值为’step’或’stepfilled’,rwidth设置失效,即不能指定柱子之间的间隔,默认连接在一起; align:{‘left’, ‘mid’, ‘right’};‘left’:柱子的中心位于bins的左边缘;‘mid’:柱子位于bins左右边缘之间;‘right’:柱子的中心位于bins的右边缘; orientation:{‘horizontal’, ‘vertical’}:如果取值为horizontal,则条形图将以y轴为基线,水平排列;简单理解为类似bar()转换成barh(),旋转90°; rwidth:标量值或None。柱子的宽度占bins宽的比例; log:布尔值。如果取值为True,则坐标轴的刻度为对数刻度;如果log为True且x是一维数组,则计数为0的取值将被剔除,仅返回非空的(frequency, bins, patches); color:具体颜色,数组(元素为颜色)或None。 label:字符串(序列)或None;有多个数据集时,用label参数做标注区分; stacked:布尔值。如果取值为True,则输出的图为多个数据集堆叠累计的结果;如果取值为False且histtype=‘bar’或’step’,则多个数据集的柱子并排排列; normed: 是否将得到的直方图向量归一化,即显示占比,默认为0,不归一化;不推荐使用,建议改用density参数; edgecolor: 直方图边框颜色; alpha: 透明度; 返回值(用参数接收返回值,便于设置数据标签): n:直方图向量,即每个分组下的统计值,是否归一化由参数normed设定。当normed取默认值时,n即为直方图各组内元素的数量(各组频数); bins: 返回各个bin的区间范围; patches:返回每个bin里面包含的数据,是一个list。 其他参数与plt.bar()类似。

案例18 美化的直方图

代码语言:javascript复制
import matplotlib.pyplot as plt 
import numpy as np 
np.random.seed(0)
x = np.random.normal(0, 1, 5000) # 生成符合正态分布的5000个随机样本
plt.figure(figsize=(14,7)) #设置图片大小 14x7 inch
plt.style.use('seaborn-whitegrid') # 设置绘图风格
n, bins, patches = plt.hist(x, bins=90, facecolor = '#2ab0ff', 
                            edgecolor='#169acf', linewidth=0.5)
n = n.astype('int') # 返回值n必须是整型
# 设置显式中文的字体
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False   # 显式负号'-'
#为每个条形图设置颜色
for i in range(len(patches)):
    patches[i].set_facecolor(plt.cm.viridis(n[i]/max(n)))
#对某个特定条形(如第70个)做特别说明   
patches[49].set_fc('red') # 设置颜色
patches[49].set_alpha(1) # 设置透明度
#添加注释
plt.annotate('这是一个重要条形!', xy=(0.5, 160), xytext=(1.5, 130), fontsize=15, 
             arrowprops={'width':0.4,'headwidth':5,'color':'#333333'})
# 设置X和Y轴标题和字体大小
plt.title('正态分布', fontsize=12)
plt.xlabel('不同的间隔(bins)', fontsize=10)
plt.ylabel('频度大小', fontsize=10)
plt.show()

案例19 饼图

代码语言:javascript复制
import matplotlib.pyplot as plt
# 为在Matplotlib中显示中文,设置特殊字体
plt.rcParams['font.sans-serif']=['SimHei']
#为图片设置大小和分辨率
plt.figure(figsize = (9, 6), dpi = 100)
x = [217,743,426]
labels = ['走路去','自行车','公交车']
explode = [0,0.05,0]

_, _, autotexts = plt.pie(x = x,labels = labels,shadow = 1,
                          autopct = '%.1f%%',explode = explode)
#将饼状图中的字体改成白色
for autotext in autotexts:
    autotext.set_color('white')

plt.title('3种去学校的方式')
plt.show()

案例20 箱型图

代码语言:javascript复制
import matplotlib.pyplot as plt
import numpy as np
#读取数据
data = []
with open('./chap08-matplotlib/范例8-19/iris.csv','r') as file :
    lines = file.readlines() #读取数据行的数据
    for line in lines:        #对于每行数据进行分析
        temp = line.split(',')
        data.append(temp)
        
#转换为Numpy数组,方便后续处理
data_np = np.array(data)
#不读取最后一列,并将数值部分转换为浮点数
data_np = np.array(data_np[:,:-1]).astype(float)

#特征名称
labels = ['sepal length','sepal width','petal length','petal width']
plt.boxplot(data_np,labels=labels)
plt.show()

案例21 误差条

代码语言:javascript复制
import math
import matplotlib.pyplot as plt
import numpy as np
#正确显示负号
plt.rcParams['axes.unicode_minus'] = False
#生成正弦曲线
x = np.linspace(-math.pi, math.pi, num = 48)
y = np.sin(x   0.05 * np.random.standard_normal(len(x)))
y_error = 0.1 * np.random.standard_normal(len(x))
print(y)

print(y_error)

 #Axis setup
fig = plt.figure()
axis = fig.add_subplot(111) 

#绘制图形
axis.set_ylim(-0.5 * math.pi, 0.5 * math.pi)    #Set the y-axis view limits.
#plt.figure(figsize=(9, 6), dpi=100)
plt.plot(x, y, 'r--', label= 'y:sin(x)')
plt.plot(x, y_error, 'g--', label= 'y_error:sin(x)')
plt.errorbar(x, y, yerr = y_error,fmt='o')

plt.legend(loc = 'best')
plt.show()

案例22 3d图形

代码语言:javascript复制
import numpy as np 
import matplotlib.pyplot as plt 
#导入绘制三维图形模块
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(14,7))

#绘制三维曲线图
ax1 = fig.add_subplot(221,projection='3d')
theta = np.linspace(-4*np.pi,4*np.pi,500)
z = np.linspace(-2,2,500)
r = z**2   1
x = r*np.sin(theta)
y = r*np.cos(theta)
#方法与绘制二维曲线图相同
ax1.plot(x,y,z)
ax1.set_xlabel('x',fontsize=15)
ax1.set_ylabel('y',fontsize=15)
ax1.set_zlabel('z',fontsize=15)

#绘制三维点图
ax2 = fig.add_subplot(222,projection='3d')
x = np.random.randn(500)
y = np.random.randn(500)
z = np.random.randn(500)
#方法同二维散点图
ax2.scatter(x,y,z,c='r')
ax2.set_xlabel('x',fontsize=15)
ax2.set_ylabel('y',fontsize=15)
ax2.set_zlabel('z',fontsize=15)

#绘制三维曲面图
ax3 = fig.add_subplot(223,projection='3d')
x = np.linspace(-2,2,500)
y = np.linspace(-2,2,500)
x,y = np.meshgrid(x,y)
z = np.sqrt(x**2   y**2)

ax3.plot_surface(x,y,z,cmap=plt.cm.winter)
ax3.set_xlabel('x',fontsize=15)
ax3.set_ylabel('y',fontsize=15)
ax3.set_zlabel('z',fontsize=15)

#绘制三维柱状图
ax4 = fig.add_subplot(224,projection='3d')
for z in np.arange(0,40,10):
    x = np.arange(20)
    y = np.random.rand(20)
    # x为柱子的宽度,y为条形图的高度
    # zs 为组数, zdir为哪个轴充当z轴
    ax4.bar(left = x,height = y,zs=z,zdir='y') 
ax4.set_xlabel('x',fontsize=15)
ax4.set_ylabel('y',fontsize=15)
ax4.set_zlabel('z',fontsize=15)

plt.show()

0 人点赞