最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中使用Chaco繪圖庫

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

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

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

面向腳本繪圖

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

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ù)的第三個參數(shù)中的"r"指定繪圖的顏色為紅色,"-"指定繪圖的線型為實線。title函數(shù)為繪圖添加標題,ytitle為Y軸添加標題,show()函數(shù)最終顯示繪圖結(jié)果。

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

面向應用繪圖

要將Chaco嵌入到別的應用程序之中,需要做一些額外的工作,因此代碼量比面向腳本繪圖要多,不過同時也更具有靈活性。先來看一個例子:

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()

這段代碼看起來似乎挺復雜,其實只要掌握了其基本設計思想,就很容易理解了。首先是許多import語句,為了保持應用程序的名字空間整潔以及讓自動語法檢查工具能幫助我們檢查代碼,這些語句只import了需要的對象。

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

接下來的代碼部分:

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

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

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

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

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

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的功能才能真正在我們的實例中出現(xiàn)。

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

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

plot = Plot(plotdata)

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

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

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

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

然后設置繪圖的標題,并且把繪圖實例賦值給plot屬性:

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

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

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

由于沒有給configure_traits傳遞視圖參數(shù),它將在LinePlot實例中尋找視圖的定義,于是它找到traits_view,并且用此視圖來顯示LinePlot實例的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()

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

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

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

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

為了讓legend對象知道要顯示什么曲線的圖示,我們需要把曲線對象傳遞給它。三次調(diào)用plot繪制的曲線可以通過plot對象plots屬性得到,在iPython中運行完上面的程序之后,輸入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對象添加到plot.overlays中。整個繪圖區(qū)域分為許多層,每一層放置不同的繪圖元素,overlays是最上面的一層,其中放置在屏幕坐標系中的繪圖元素。plot的overlays屬性為一個TraitListObject類的對象,它繼承于list類,具有l(wèi)ist的所有能力,因此可以用append方法將繪圖元素添加進overlays層。

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

相關文章

  • python串口如何讀取byte類型數(shù)據(jù)并訪問

    python串口如何讀取byte類型數(shù)據(jù)并訪問

    這篇文章主要介紹了python串口如何讀取byte類型數(shù)據(jù)并訪問方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 利用Python快速繪制海報地圖

    利用Python快速繪制海報地圖

    這篇文章主要介紹了如何利用Python快速繪制海報級別的地圖,,需要的朋友可以參考下面文章的詳細介紹
    2021-09-09
  • 一文詳細介紹PyQt5 QPushButton() 的作用

    一文詳細介紹PyQt5 QPushButton() 的作用

    通過本文的介紹,相信你已經(jīng)對PyQt5中的QPushButton控件有了深入的了解,從基礎介紹到常用屬性和方法,再到應用場景和樣式定制,本文為你提供了全面的指南,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • python實現(xiàn)mysql的讀寫分離及負載均衡

    python實現(xiàn)mysql的讀寫分離及負載均衡

    這篇文章主要介紹了python實現(xiàn)mysql的讀寫分離及負載均衡 ,需要的朋友可以參考下
    2018-02-02
  • Selenium webdriver添加cookie實現(xiàn)過程詳解

    Selenium webdriver添加cookie實現(xiàn)過程詳解

    這篇文章主要介紹了Selenium webdriver添加cookie實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • python?opencv的imread方法無法讀取圖片問題

    python?opencv的imread方法無法讀取圖片問題

    這篇文章主要介紹了python?opencv的imread方法無法讀取圖片問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python畫圖常見不同圖片格式保存方式

    python畫圖常見不同圖片格式保存方式

    這篇文章主要介紹了python畫圖常見不同圖片格式保存方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python從wsgi導入失敗的問題解決方法

    Python從wsgi導入失敗的問題解決方法

    本文主要介紹了Python從wsgi導入失敗的問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • jupyter notebook遠程訪問不了的問題解決方法

    jupyter notebook遠程訪問不了的問題解決方法

    這篇文章主要介紹了jupyter notebook遠程訪問不了的問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • python雙向鏈表實例詳解

    python雙向鏈表實例詳解

    這篇文章主要為大家詳細介紹了python雙向鏈表實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論

保靖县| 长沙县| 台南县| 临清市| 花莲县| 徐州市| 胶州市| 靖西县| 沐川县| 海淀区| 外汇| 廊坊市| 沽源县| 随州市| 平远县| 六安市| 渑池县| 温州市| 浙江省| 罗源县| 宁乡县| 陈巴尔虎旗| 郧西县| 东丰县| 原平市| 彭阳县| 湖北省| 江门市| 彰武县| 青铜峡市| 瓮安县| 南召县| 普安县| 清水河县| 陵川县| 广昌县| 长岭县| 三河市| 金溪县| 景谷| 松阳县|