Matplotlib初学

牛刀小试


  1. 导入类库:
    import matplotlib.pyplot as plt

  2. 画图:
    plt.plot([1, 2, 3, 4])
    如果只提供了一个参数给plot()时,默认是给y的,自动生成x。

  3. 给图添加修饰
    plt.xlabel('x label') # 横坐标
    plt.ylabel('y label') # 纵坐标
    plt.title('Test') # 标题

  4. 显示
    plt.show()
    结果如图1所示

    图1.png

接下来,我们改变一些参数试试:


  1. 可以给plot()传入多个参数:
    plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')
    第一个列表参数赋值给x
    第二个列表参数赋值给y
    第三个参数“ro”种r表示颜色,o表示形状

  2. 通过axis()改变坐标轴的度量
    plt.axis([0, 6, 0, 20])
    列表的前两个数表示x轴的范围,0~6
    列表的后两个数表示y轴的范围,0~20

  3. 同样使用plt.show()显示图像
    plt.show()
    结果如图2所示

图2.png
  1. 但通用的方法还是给plot()传入数组
    import numpy as np
    array = np.arange(0, 5, 0.1)
    plt.plot(array, array**2, 'bs')
    结果如图3所示
    图3.png
设置线条属性

一般有以下几个方法设置线条属性

  1. 使用关键字:plt.plot(x, y, linewidth=2.0)
  2. 使用plot返回一个由二维线条对象组成的列表,该对象有一个setter方法
    line, = plt.plot(x, y, '-') # 此处返回的列表长度为1
    line.set_antialiased(False) # 设置antialising属性为False
  3. 使用setp()命令,可以使用关键字标注和matlab风格的方式
    lines = plt.plot(x1, y1, x2, y2) # 返回线条列表,长度为2
    plt.setp(lines, color='r', linewidth=2.0) # 使用keyword
    plt.setp(lines, 'color', 'r', 'linewidth', 2.0) # matlab风格

常用的属性

多图和axes


Matplotlib和Matlab一样,都有图和子图的概念,图用figure表示,子图用axes表示
所有使用plt的操作都是针对当前的图或子图进行的

  • gca()可以输出当前的axes
  • gcf()可以输出当前的figure
  1. 下面是一个多图多子图的例子:

x = np.arange(0, 5, 0.1)

plt.figure(1) # 创建了图1(figure(1))
plt.subplot(211) # 在figure1种生成子图1
plt.plot(x, np.sin(x)) # 在当前子图,也就是子图1种画图
plt.subplot(212) # 在figure1中生成子图2
plt.plot(x, x**2)

plt.figure(2)
plt.subplot(131)
plt.plot(x, x)
plt.subplot(132)
plt.plot(x, 2*x+1)
plt.subplot(133)
plt.plot(x, np.cos(x))

plt.show()

其中:

  • 在创建子图时使用了plt.subplot(211),其中的211可以这样解释:前两位数可以理解为2*1,也就是在figure1中生成两个子图,最后一位1解释为子图编号,也就是figure1中的第一个子图
  • 211也可理解为图的布局为两行一列的第一个图,132就理解为一行三列的第二副图

上面程序的运行结果:

Figure1.png
Figure_2.png
  1. 上面的创建图和子图的方法有些麻烦,有一种更为简单的方法:
    使用plt.subplots创建新的figure,返回值为已创建subplot对象的Numpy数组:
    >>>fig, axes = plt.subplots(2, 3)
    >>>axes
    [[<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940B0D940>
    <matplotlib.axes._subplots.AxesSubplot object at 0x0000022940CAC550>
    <matplotlib.axes._subplots.AxesSubplot object at 0x0000022940CE5240>]
    [<matplotlib.axes._subplots.AxesSubplot object at 0x0000022940D77748>
    <matplotlib.axes._subplots.AxesSubplot object at 0x0000022940D88FD0>
    <matplotlib.axes._subplots.AxesSubplot object at 0x0000022940E41780>]]
    结果如图6,在一个figure中创建了6个子图

    图6.png

    figure过度时会导致内存警告
    可以使用clg()删除当前figure,cla()删除当前的axes

  2. plt针对当前子图进行操作,而axes只关注它本身
    使用axes也可以操作子图
    fig = plt.figure()
    ax = fig.add_subplot(111)
    x = np.arange(1, 5, 0.1)
    y = x**3
    ax.scatter(x, y)
    ax.set_xlabel('x label')
    ax.set_ylabel('y label')
    plt.show()
    结果如图7所示

图7.png

文本工作


  1. 可以使用text()在任意位置添加文本

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

# the histogram of the data
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)

plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
结果如图8所示

图8.png

  • 使用plt.text(60, .025, r'$\mu=100,\ \sigma=15$')在点(60, 0.025)处添加了文本u=100, sigma=15
  • plt.grid(True)表示在图中添加网格
  1. 使用annotate()

from numpy import pi
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)

plt.annotate('point(2, 1)', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05),
)

plt.ylim(-2,2)
lt.show()
运行结果如图9所示

图9.png

使用

plt.annotate('point(2, 1)', xy=(2, 1), xytext=(3, 1.5),
         arrowprops=dict(facecolor='black', shrink=0.05),
               )

来进行注释,point(2, 1)', xy=(2, 1)表示在点(2, 10)处添加文本"point(2, 1)"
xytext=(3, 1.5),arrowprops=dict(facecolor='black', shrink=0.05)表示注释文本的位置为(3, 1.5)处,arrowprops描述了箭头

使用文本的方法
  1. 所有的test()方法都会返回一个matplotlib.text.Text实例,可以使用关键字参数和setp()的形式使用文本。
    t = plt.xlabel('my data', fontsize=14, color='red')
  2. matplotib可以使用TeX表达式描述任何文本,比如文本
    可以使用“$”包围的TeX表达式描述:
    plt.title(r'$\sigma_i=15$')
 这里有一些常用的数学式表述方式
 http://matplotlib.org/users/mathtext.html#mathtext-tutorial

保存到文件


使用plt.savefig()将当前图保存到文件
例如:将figure保存为svg文件,plt.savefig('figpath.svg')

总结一些自己学习的知识点,谢谢!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容