Python Matplotlib初探究

本文介绍了Python的Matplotlib库,包括图像构成、数据输入、Matplotlib、pyplot和pylab的关系,以及编码风格建议。Matplotlib是用于2D绘图的库,类似于Matlab。文章详细阐述了Axes、Axis和Artist的概念,并提供了数据输入的建议,同时强调了使用pandas或np.matrix进行数据输入。此外,文章还讨论了pyplot和pylab的区别,以及编码风格的最佳实践。
摘要由CSDN通过智能技术生成

Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。 Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包

官方文档
https://matplotlib.org/users/index.html

这里基本是按照文档的第一篇看下来,一边读一边实践

Matplotlib库类似于Matlab,使用之前先导入

# sphinx_gallery_thumbnail_number = 3
'''
科学计算包+画图包,要用到matplotlib.pyplot
'''
import matplotlib.pyplot as plt
import numpy as np

图像的构成

在这里插入图片描做好一张图,要除了数据集图像要画好,也要处理好表头、标签、坐标轴等一系列的地方,对应不同的设置函数和API

先解释几个概念:(实际上是三个类)
Axes:
是我们理解的‘一张图’,一张子图,每个子图有自己对应的坐标系和数据集
通过set_xlim() and set_ylim()函数来控制数据
set_title()来设置标题
x-label (set via set_xlabel()), and a y-label set via set_ylabel()).设置标签
具体这几个函数用到的时候在展开

Axis:
这个类来设置坐标轴/刻度线等等

Artist
文档讲Basically everything you can see on the figure is an artist
所有图中看到的东西都是Artist,这个class里面是图中的其他地方的设置,让数据可视化变得好看、清楚的东西

eg:

fig, ax_lst = plt.subplots(2, 2)
fig.suptitle('aaa')
plt.show()

在这里插入图片描述获得了一个2*2的子图
查阅subplots的文档

>>> help(plt.subplots)
Help on function subplots in module matplotlib.pyplot:

subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
    Create a figure and a set of subplots.

前两个参数对应n行m列
三四个参数是设置,是否公用x,y轴,有四种情况
设置为 True 或者 ‘all’ 时,所有子图共享 x 轴或者 y 轴,
设置为 False or ‘none’ 时,所有子图的 x,y 轴均为独立,
设置为 ‘row’ 时,每一行的子图会共享 x 或者 y 轴,
设置为 ‘col’ 时,每一列的子图会共享 x 或者 y 轴
后面的几个参数与函数的返回值有关,就不具体展开了

可以通过以下方式,对每个子图操作

fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'})
'''例如这样,可以对两个子图分开进行处理'''

数据输入

文档建议用pandas 或者np.matrix 的方法来输入数据集

前者本菜鸡没有接触过,后者栗子如下:

b = np.matrix([[1,2],[3,4]])
b_asarray = np.asarray(b)

Matplotlib, pyplot and pylab关系

matplotlib是完整的包,pyplot是里面一个模块,用来自动画图,pylab是和matplotlib一起下载安装的模块(我觉得意思是pylab不属于matplotlib包)
举了一个plot的栗子

import numpy as np

import matplotlib.pyplot as plt

'''
Help on function linspace in module numpy:

linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
    Return evenly spaced numbers over a specified interval.
    
    Returns `num` evenly spaced samples, calculated over the
    interval [`start`, `stop`].
    前面三个参数较好理解,endpoint=True意味包含结尾,
    举例如下
    >>> np.linspace(2.0, 3.0, num=5)
    array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ])
>>> np.linspace(2.0, 3.0, num=5, endpoint=False)
    array([ 2. ,  2.2,  2.4,  2.6,  2.8])
    retstep参数选择是否返回间隔值
    >>> np.linspace(2.0, 3.0, num=5, retstep=True)
    (array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ]), 0.25)
'''

#从0-2,均匀的取100个值(也就是每隔0.02取一个值)
x = np.linspace(0, 2, 100)

#x,y,label标签
plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')

#设置x/y轴的标签
plt.xlabel('x label')
plt.ylabel('y label')

#标题
plt.title("Simple Plot")

#设置的是左上角的那个标注,默认是都和label一样,所以不用再设置了
plt.legend()

plt.show()

图像如下
在这里插入图片描述Pylab是一个模块,他的作用是把matplotlib和numpy两个包导入到同一个命名空间,官方文档强烈建议不要使用pylab,用pyplot代替

这里还有一个神奇的小插曲。。。
我导入的时候会提示:
AttributeError: module ‘matplotlib’ has no attribute 'pyplot’
差点骗的我把matplotlib重装,然后发现是我自己在桌面上建了一个matplotlib.py文件,python import的时候先找到了我放在桌面上的文件
承包今天的笑点23333

编码风格建议

1.开头一般是这样导入

import matplotlib.pyplot as plt
import numpy as np

2.为啥不像MATLAB一样,直接用全局状态、平面命名空间?
优势是学术性的,可以风格更明确,更清楚的表达出事物的来源和发展,尤其对于复杂的程序,可以使程序更容易编写和维护
3.会遇到数据集不同,但是画相同、类似图的情况,因此建议编写专门的函数来绘图
eg:

def my_plotter(ax, data1, data2, param_dict):
    """
    A helper function to make a graph
    Parameters
    ----------
    ax : Axes
        The axes to draw to
    data1 : array
       The x dat
    data2 : array
       The y data
    param_dict : dict
       Dictionary of kwargs to pass to ax.plot
    Returns
    -------
    out : list
        list of artists added
    """
    out = ax.plot(data1, data2, **param_dict)
    return out

# which you would then use as:

data1, data2, data3, data4 = np.random.randn(4, 100)
fig, ax = plt.subplots(1, 1)
my_plotter(ax, data1, data2, {'marker': 'x'})

当遇到复杂(多图)的情况时就很有用
只需要少量修改(修改函数外的东西)

fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'})

后面的东西都偏理论一点 ,只稍微提一下,具体都不展开了,毕竟学习matplotlib的目的是作图

Backends:后端
针对不同的用例(使用方式)和输出格式,完成后台的绘制图形的工作
比方说我计划是学习matplotlib来做python的机器学习,其他人可能是做web应用服务器绘图,而我们都不需要知道,ok,图是具体怎么画的
Backends分交互式后端和非交互式后端

后面介绍了怎么配置,我这里暂时用不到,就不翻了

对我有用的结论,交互后端自动显示图像,非交互的,调用个show()函数就ojbk了

然后是渲染问题:
用了几种方法来减少渲染时间,但是绘图外观会受到影响
后面的巴拉巴拉的介绍,暂时都用不到了,就先到这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值