欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中使用Chaco繪圖庫(kù)

 更新時(shí)間:2023年11月04日 16:22:55   投稿:yin  
這篇文章主要介紹了Python中使用Chaco繪圖庫(kù),Chaco是一個(gè)2D的繪圖庫(kù),如果你安裝了Python(x,y)的話,可以在pythonxy的安裝目錄下的找到Chaco的demo程序,Chaco提供了類似Matlab和pylab的繪圖方式,我們稱之為面向腳本的繪圖方式

Chaco是一個(gè)2D的繪圖庫(kù),如果你安裝了Python(x,y)的話,可以在pythonxy的安裝目錄下的找到Chaco的demo程序:

\pythonxy\doc\Enthought Tool Suite\Chaco\examples\demo.py

面向腳本繪圖

Chaco提供了類似Matlab和pylab的繪圖方式,我們稱之為面向腳本的繪圖方式。下面的程序從enthought.chaco.shell中導(dǎo)入腳本繪圖相關(guān)的內(nèi)容,然后用numpy快速產(chǎn)生一個(gè)正弦波的x,y坐標(biāo)的數(shù)組,然后傳遞給plot函數(shù)進(jìn)行繪圖:

import numpy as np
from enthought.chaco.shell import *

x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.sin(x)

plot(x, y, "r-")
title("First plot")
ytitle("sin(x)")
show()

plot函數(shù)的第三個(gè)參數(shù)中的"r"指定繪圖的顏色為紅色,"-"指定繪圖的線型為實(shí)線。title函數(shù)為繪圖添加標(biāo)題,ytitle為Y軸添加標(biāo)題,show()函數(shù)最終顯示繪圖結(jié)果。

腳本繪圖不是Chaco的強(qiáng)項(xiàng),雖然它的這套腳本繪圖API和Matplotlib的pylab類似,不過(guò)它提供的功能卻沒(méi)有pylab豐富。Chaco的優(yōu)勢(shì)在于它可以很方便地嵌入到你的應(yīng)用程序之中,開(kāi)發(fā)出自己獨(dú)特的繪圖應(yīng)用。

面向應(yīng)用繪圖

要將Chaco嵌入到別的應(yīng)用程序之中,需要做一些額外的工作,因此代碼量比面向腳本繪圖要多,不過(guò)同時(shí)也更具有靈活性。先來(lái)看一個(gè)例子:

from enthought.traits.api import HasTraits, Instance
from enthought.traits.ui.api import View, Item
from enthought.chaco.api import Plot, ArrayPlotData
from enthought.enable.component_editor import ComponentEditor
from numpy import linspace, sin

class LinePlot(HasTraits):
    plot = Instance(Plot)
    traits_view = View(
        Item('plot',editor=ComponentEditor(), show_label=False),
        width=500, height=500, resizable=True, title="Chaco Plot")

    def __init__(self):
        super(LinePlot, self).__init__()
        x = linspace(-14, 14, 100)
        y = sin(x) * x**3
        plotdata = ArrayPlotData(x=x, y=y)
        plot = Plot(plotdata)
        plot.plot(("x", "y"), type="line", color="blue")
        plot.title = "sin(x) * x^3"
        self.plot = plot

if __name__ == "__main__":
    LinePlot().configure_traits()

這段代碼看起來(lái)似乎挺復(fù)雜,其實(shí)只要掌握了其基本設(shè)計(jì)思想,就很容易理解了。首先是許多import語(yǔ)句,為了保持應(yīng)用程序的名字空間整潔以及讓自動(dòng)語(yǔ)法檢查工具能幫助我們檢查代碼,這些語(yǔ)句只import了需要的對(duì)象。

  • HasTraits, Instance:這兩個(gè)從traits庫(kù)中導(dǎo)入,HasTraits是所有擁有Trait屬性的類的父類,我們自己定義的LinePlot類繼承于它。而Instance用來(lái)創(chuàng)建一個(gè)Trait屬性,此屬性的值為某個(gè)指定的類的實(shí)例。
  • View, Item:從traits.ui庫(kù)導(dǎo)入,View用來(lái)創(chuàng)建一個(gè)生成用戶界面用的視圖,而Item則用來(lái)定義視圖中的元素。
  • Plot, ArrayPlotData:從chaco庫(kù)中導(dǎo)入,Plot本身是一個(gè)描述繪圖的類,它的祖先類中有HasTraits,因此它本身也是一個(gè)擁有trait屬性的類,ArrayPlotData是用來(lái)統(tǒng)一保存繪圖所用的數(shù)據(jù)的類。也就是說(shuō)Plot管理繪圖,而ArrayPlotData則用來(lái)管理繪圖所用的數(shù)據(jù)。
  • ComponentEditor:從enable庫(kù)中導(dǎo)入,用戶界面視圖中使用ComponentEditor來(lái)顯示LinePlot類的plot屬性。如果trait屬性為Int、Str或者Float之類的簡(jiǎn)單類型的話,系統(tǒng)能夠自動(dòng)的幫我們選擇對(duì)應(yīng)的GUI元素來(lái)顯示它們。但是系統(tǒng)不知道如何顯示Chaco中定義的Plot這樣的的類型,因此我們必須手工指定采用ComponentEditor來(lái)顯示Plot。
  • linspace, sin:從numpy庫(kù)中導(dǎo)入,linspace用來(lái)產(chǎn)生一個(gè)等差數(shù)列,numpy中的sin函數(shù)可以自動(dòng)對(duì)數(shù)組中的每個(gè)元素進(jìn)行計(jì)算。

接下來(lái)的代碼部分:

class LinePlot(HasTraits):
    plot = Instance(Plot)

首先定義一個(gè)LinePlot繼承于HasTraits,并且它有一個(gè)trait屬性plot為Plot類的實(shí)例。然后定義視圖:

traits_view = View(
        Item('plot',editor=ComponentEditor(), show_label=False),
        width=500, height=500, resizable=True, title="Chaco Plot")

此視圖在LinePlot類中定義,因此在調(diào)用configure_traits的時(shí)候就不需要指定視圖了。視圖中有一個(gè)元素,它將用來(lái)顯示名為plot的屬性的內(nèi)容,視圖中的元素用Item創(chuàng)建。注意這里使用字符串指定視圖元素所對(duì)應(yīng)的屬性。然后通過(guò)關(guān)鍵字參數(shù)editor指定此視圖元素采用ComponentEditor進(jìn)行顯示。并且不顯示其標(biāo)簽(show_label=False)。通過(guò)View的關(guān)鍵字參數(shù)width、height、resizable和title分別指定界面的寬、高、是否可改變大小以及其窗口標(biāo)題欄的文字。

接下來(lái)看構(gòu)造函數(shù),真正的計(jì)算在這里:

def __init__(self):
    super(LinePlot, self).__init__()
    x = linspace(-14, 14, 100)
    y = sin(x) * x**3
    plotdata = ArrayPlotData(x=x, y=y)

在構(gòu)造函數(shù)做其它事情之前,一定要記住調(diào)用父類的構(gòu)造函數(shù),這樣HasTraits的功能才能真正在我們的實(shí)例中出現(xiàn)。

接下來(lái)和腳本繪圖一樣,計(jì)算出繪圖所需的x,y坐標(biāo)的數(shù)值數(shù)組。然后將這兩個(gè)數(shù)組存到一個(gè)ArrayPlotData對(duì)象中。ArrayPlotData和字典(dict)有些類似,它將一個(gè)字符串(數(shù)組的名字)和數(shù)組本身聯(lián)系起來(lái)。而真正的繪圖對(duì)象plot將通過(guò)數(shù)組的名字在ArrayPlotData中獲得數(shù)組的內(nèi)容。這樣做就在數(shù)據(jù)和繪圖對(duì)象中形成了一個(gè)接口界面,修改ArrayPlotData中的數(shù)組的值將會(huì)立即反應(yīng)到與此數(shù)據(jù)相連的繪圖對(duì)象,而多個(gè)繪圖對(duì)象可以共用ArrayPlotData中的同一數(shù)組。

接下來(lái)創(chuàng)建繪圖對(duì)象plot,并且將我們創(chuàng)建的ArrayPlotData實(shí)例傳遞給它,此后plot將在此實(shí)例中獲取自己繪圖所需的數(shù)據(jù)。:

plot = Plot(plotdata)

Plot類將Chaco中提供的許多真正用來(lái)繪圖的對(duì)象進(jìn)行包裝,提供了一個(gè)統(tǒng)一的接口用來(lái)創(chuàng)建和管理這些繪圖對(duì)象。在今后深入學(xué)習(xí)Chaco的過(guò)程中我們將通過(guò)分析Plot類的實(shí)現(xiàn)來(lái)了解Chaco庫(kù)的設(shè)計(jì)思想。

接下來(lái)調(diào)用plot方法在Plot內(nèi)部創(chuàng)建真正的繪圖對(duì)象(一個(gè)曲線圖):

plot.plot(("x", "y"), type="line", color="blue")

注意我們傳遞給plot方法的是數(shù)組的名字而不是數(shù)組本身,Plot對(duì)象會(huì)自動(dòng)通過(guò)數(shù)組的名字在ArrayPlotData的實(shí)例中找到其對(duì)應(yīng)的數(shù)組。

然后設(shè)置繪圖的標(biāo)題,并且把繪圖實(shí)例賦值給plot屬性:

plot.title = "sin(x) * x^3"
self.plot = plot

最后是LinePlot對(duì)象的實(shí)例化和調(diào)用configure_trait顯示繪圖窗口:

if __name__ == "__main__":
    LinePlot().configure_traits()

由于沒(méi)有給configure_traits傳遞視圖參數(shù),它將在LinePlot實(shí)例中尋找視圖的定義,于是它找到traits_view,并且用此視圖來(lái)顯示LinePlot實(shí)例的trait屬性。于是plot屬性將如traits_view中定義的一樣,用ComponentEditor顯示。

采用和LinePlot類同樣的模式,我們可以繪制更多的曲線圖:

from enthought.traits.api import HasTraits, Instance
from enthought.traits.ui.api import View, Item
from enthought.chaco.api import Plot, ArrayPlotData, Legend
from enthought.enable.component_editor import ComponentEditor
from numpy import linspace, sin, cos

class LinePlot(HasTraits):
    plot = Instance(Plot)
    traits_view = View(
        Item('plot',editor=ComponentEditor(), show_label=False),
        width=500, height=500, resizable=True, title="Chaco Plot")

    def __init__(self):
        super(LinePlot, self).__init__()
        x = linspace(-14, 14, 100)
        y1 = sin(x) * x**3
        y2 = cos(x) * x**3
        plotdata = ArrayPlotData(x=x, y1=y1, y2=y2)
        plot = Plot(plotdata)
        plot.plot(("x", "y1"), type="line", color="blue", name="sin(x) * x**3")
        plot.plot(("x", "y2"), type="line", color="red", name="cos(x) * x**3")
        plot.plot(("x", "y2"), type="scatter", color="red", marker = "circle",
                  marker_size = 2, name="cos(x) * x**3 points")
        plot.title = "Multiple Curves"
        self.plot = plot

        legend = Legend(padding=10, align="ur")
        legend.plots = plot.plots
        plot.overlays.append(legend)        

if __name__ == "__main__":
    lineplot = LinePlot()
    lineplot.configure_traits()

在這個(gè)程序中,我們調(diào)用了3次plot.plot方法,其中兩次的type="line"繪制曲線,一次是type="scatter"繪制坐標(biāo)點(diǎn)。繪制坐標(biāo)點(diǎn)時(shí)通過(guò)marker和marker_size配置點(diǎn)的形狀和大小。并且我們?yōu)槊總€(gè)plot傳遞了一個(gè)name參數(shù)。

為了繪制圖示(legend),從chaco.api中載入Legend之后,使用如下三行代碼為坐標(biāo)圖添加圖示::

legend = Legend(component=plot, padding=10, align="ur")
legend.plots = plot.plots
plot.overlays.append(legend)

其中第一行創(chuàng)建一個(gè)Legend對(duì)象,并且設(shè)置padding和align兩個(gè)屬性,padding設(shè)置其內(nèi)容與邊框之間的距離,align設(shè)置其在容器中的位置: upper right。

為了讓legend對(duì)象知道要顯示什么曲線的圖示,我們需要把曲線對(duì)象傳遞給它。三次調(diào)用plot繪制的曲線可以通過(guò)plot對(duì)象plots屬性得到,在iPython中運(yùn)行完上面的程序之后,輸入lineplot.plot.plots查看plots屬性的值:

>>> lineplot.plot.plots
{'cos(x) * x**3 points': [<enthought.chaco.scatterplot.ScatterPlot object at 0x1436B4B0>],
'cos(x) * x**3': [<enthought.chaco.lineplot.LinePlot object at 0x1436B120>],
'sin(x) * x**3': [<enthought.chaco.lineplot.LinePlot object at 0x143140F0>]}

我們將plot.plots傳遞給legend.plots,于是legend就知道要顯示哪些曲線的圖示了。

最后我們將legend對(duì)象添加到plot.overlays中。整個(gè)繪圖區(qū)域分為許多層,每一層放置不同的繪圖元素,overlays是最上面的一層,其中放置在屏幕坐標(biāo)系中的繪圖元素。plot的overlays屬性為一個(gè)TraitListObject類的對(duì)象,它繼承于list類,具有l(wèi)ist的所有能力,因此可以用append方法將繪圖元素添加進(jìn)overlays層。

到此這篇關(guān)于Python中使用Chaco繪圖庫(kù)的文章就介紹到這了,更多相關(guān)Python使用Chaco內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Python對(duì)Csv文件操作實(shí)例代碼

    使用Python對(duì)Csv文件操作實(shí)例代碼

    這篇文章主要介紹了使用Python對(duì)Csv文件操作實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-05-05
  • 搞笑的程序猿:看看你是哪種Python程序員

    搞笑的程序猿:看看你是哪種Python程序員

    這篇文章主要介紹了搞笑的程序猿:看看你是哪種Python程序員,不久前,在互聯(lián)網(wǎng)上出現(xiàn)了一篇有趣的文章,講的是對(duì)于同一個(gè)問(wèn)題,不同層次的Python程序員編出的Python代碼,顯示出了不同的風(fēng)格,代碼都很簡(jiǎn)單,有趣,需要的朋友可以參考下
    2015-06-06
  • python隨機(jī)生成大小寫字母數(shù)字混合密碼(僅20行代碼)

    python隨機(jī)生成大小寫字母數(shù)字混合密碼(僅20行代碼)

    這篇文章主要介紹了python隨機(jī)生成大小寫字母數(shù)字混合密碼,主要是利用random模塊隨機(jī)生成數(shù)字,大小寫字母,通過(guò)循環(huán)次數(shù)來(lái)實(shí)現(xiàn)此功能,需要的朋友可以參考下
    2020-02-02
  • Python入門_淺談邏輯判斷與運(yùn)算符

    Python入門_淺談邏輯判斷與運(yùn)算符

    下面小編就為大家?guī)?lái)一篇Python入門_淺談邏輯判斷與運(yùn)算符。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Pytorch中的torch.where函數(shù)使用

    Pytorch中的torch.where函數(shù)使用

    這篇文章主要介紹了Pytorch中的torch.where函數(shù)使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python之實(shí)現(xiàn)兩個(gè)或多個(gè)列表相加

    python之實(shí)現(xiàn)兩個(gè)或多個(gè)列表相加

    這篇文章主要介紹了python之實(shí)現(xiàn)兩個(gè)或多個(gè)列表相加方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python自定義函數(shù)實(shí)現(xiàn)一個(gè)數(shù)的三次方計(jì)算方法

    python自定義函數(shù)實(shí)現(xiàn)一個(gè)數(shù)的三次方計(jì)算方法

    今天小編就為大家分享一篇python自定義函數(shù)實(shí)現(xiàn)一個(gè)數(shù)的三次方計(jì)算方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python獲取時(shí)間戳的幾種方法詳細(xì)示例

    Python獲取時(shí)間戳的幾種方法詳細(xì)示例

    這篇文章主要給大家介紹了關(guān)于Python獲取時(shí)間戳的幾種方法,時(shí)間戳通常是一個(gè)字符序列,唯一地標(biāo)識(shí)某一刻的時(shí)間,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 淺談Python程序與C++程序的聯(lián)合使用

    淺談Python程序與C++程序的聯(lián)合使用

    這篇文章主要介紹了淺談Python程序與C++程序的聯(lián)合使用,主要包括6中方案,需要的朋友可以參考下
    2015-04-04
  • Python綜合應(yīng)用名片管理系統(tǒng)案例詳解

    Python綜合應(yīng)用名片管理系統(tǒng)案例詳解

    這篇文章主要介紹了Python綜合應(yīng)用名片管理系統(tǒng),結(jié)合具體案例形式詳細(xì)分析了Python名片管理系統(tǒng)相關(guān)步驟、原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01

最新評(píng)論