了解matplotlib:plt,figure,ax(arr)?

时间:2016-02-28 01:47:21

标签: python matplotlib plot figure

我对matplotlib并不陌生,我非常惭愧地承认我一直将它作为一种工具,尽可能快速简便地获得解决方案。所以我知道如何获得基本情节,子图和东西,并且有不少代码可以不时重复使用......但我没有"深刻的(呃)知识" matplotlib

最近我想我应该改变这一点并通过一些教程自己动手。但是,我仍然对matplotlibs pltfig(ure)ax(arr)感到困惑。真正的区别是什么?

在大多数情况下,对于某些人来说,快速的“肮脏”'绘图我看到人们只使用pyplot as plt并直接用plt.plot绘图。由于我经常使用多种内容进行绘制,因此我经常使用f, axarr = plt.subplots() ...但大多数情况下,您只会看到代码将数据放入axarr并忽略图f

所以,我的问题是:什么是使用matplotlib的干净方式?何时仅使用pltfigure应该用于什么或应该用什么?子图是否只包含数据?或者对于样式,清理情节,......,在子图中都是有效且良好的做法?

我希望这不是广泛的。基本上我要求为plt< - >的真正目的提出一些建议。 fig< - > ax(arr)(以及何时/如何正确使用它们)。

教程也欢迎。 matplotlib文档对我来说相当混乱。当人们搜索一些非常具体的东西时,比如重新标记一个图例,不同的情节标记和颜色等等,官方文档确实非常准确,但在我看来,一般信息并不是那么好。太多不同的例子,没有对目的的真正解释......看起来或多或少像是所有可能的API方法和参数的大清单。

3 个答案:

答案 0 :(得分:12)

pyplot是'脚本' matplotlib中的级别API(其最高级别的API,可以使用matplotlib做很多事情)。它允许您使用程序界面使用matplotlib,方法与使用Matlab进行操作相似。 pyplot有一个“当前数字”的概念。和'当前轴'所有功能委托给(@tacaswell dixit)。因此,当您使用模块pyplot上的可用功能时,您正在绘制当前数字'和'当前轴'。

如果你想要'细粒'控制您正在绘制的位置/内容然后您应该使用FigureAxes的实例来使用面向对象的API。

pyplot中可用的功能在Axes中具有等效方法。

来自回购anatomy of matplotlib

  • Figure是此层次结构中的顶级容器。这是整个窗口/页面,所有内容都是绘制的。您可以拥有多个独立数字,Figure可以包含多个轴。

但是...

  • 大多数情节都在Axes上进行。轴实际上是我们绘制数据的区域以及与之相关的任何刻度/标签/等。通常我们会设置一个Axes来调用子图(将Axes放在常规网格上),因此在大多数情况下,AxesSubplot是同义。

  • 每个Axes都有一个XAxis和一个YAxis。这些包含刻度线,刻度位置,标签等。

如果您想了解情节的解剖结构,可以访问link

答案 1 :(得分:2)

我认为this教程很好地解释了matplotlib对象层次结构的基本概念,例如Figure和Axes,以及当前图形和当前Axes的概念。

如果要快速回答:有一个Figure对象,它是包装多个轴(与轴不同)的容器,该容器还包含较小的对象,例如图例,线条,刻度线...取自matplotlib documentation

enter image description here

所以当我们这样做

var express = require('express');
var app = express();
var path = require('path');
var lineReader = require('readline').createInterface({
    input: require('fs').createReadStream(__dirname + '/disksTimeSeries/timeSeries')
});

app.use(express.static('public'))

app.get('/', function(req, res) {

    res.send(index.html);
});

app.listen(3005);

var diskToTimeSeries = {};


var currDisk;
var prevDisk;
var currStr = "";
var seriesStr="";
var i = 0;
var disk;
var splitArr;

var data = {};
data['prevDisk'] = "";
data['seriesStr'] = "";


lineReader.on('line', function (line) {


    console.log(line);

    splitArr = line.split(",");

    disk = splitArr[0] + "," + splitArr[1];
    if (data['prevDisk']  && disk !== data['prevDisk'])
    {
        diskToTimeSeries[data['prevDisk']] = data['seriesStr'];
        data['seriesStr'] = "";
    }
    else
    {
        data['prevDisk'] = disk;
        data['seriesStr'] = data['seriesStr'] + (splitArr[2] + "," + splitArr[3] + "\n");
    }
    console.log(disk);
});



// viewed at http://localhost:8080
app.get('/disks', function(req, res) {

    var diskIds = req.query.ids.split(":");
    var resultStr = "";
    diskIds.forEach(function(diskName){
        resultStr += "disk name--" + diskName + "\n" + diskToTimeSeries[diskName];
    });
    res.send(resultStr);

});

module.exports = app;

我们创建了一个Figure对象和一个包含在该Figure中的Axes对象。

答案 2 :(得分:0)

  • pyplot对于那些熟悉matlab并希望制作快速而肮脏的情节的人来说就像API一样的matlab
  • figure是面向对象的API,适用于那些不关心matlab样式绘图的人

所以你可以使用其中任何一个,但也许不能同时使用。