โมดูลนี้จัดเตรียมอินเทอร์เฟซ Julia ไปยังไลบรารีการลงจุด Matplotlib จาก Python และเฉพาะกับโมดูล matplotlib.pyplot
PyPlot ใช้แพ็คเกจ Julia PyCall เพื่อเรียก Matplotlib โดยตรงจาก Julia โดยมีค่าใช้จ่ายเพียงเล็กน้อยหรือไม่มีเลย (อาร์เรย์จะถูกส่งผ่านโดยไม่ต้องทำสำเนา) (ดู PythonPlot.jl สำหรับเวอร์ชันของ PyPlot.jl ที่ใช้แพ็คเกจ PythonCall.jl ทางเลือก)
แพ็คเกจนี้ใช้ประโยชน์จากมัลติมีเดีย I/O API ของ Julia เพื่อแสดงพล็อตในแบ็กเอนด์กราฟิกของ Julia รวมถึงกราฟิกอินไลน์ใน IJulia หรือคุณสามารถใช้แบ็กเอนด์ Matplotlib แบบกราฟิกที่ใช้ Python เพื่อรองรับการซูมพล็อตเชิงโต้ตอบ ฯลฯ
(แพ็คเกจ PyPlot นี้แทนที่แพ็คเกจก่อนหน้าที่มีชื่อเดียวกันโดย Junfeng Li ซึ่งใช้ PyPlot บนซ็อกเก็ต ZeroMQ ด้วย IPython)
คุณจะต้องติดตั้งไลบรารี Python Matplotlib บนเครื่องของคุณจึงจะสามารถใช้ PyPlot ได้ คุณสามารถวางแผนอินไลน์ด้วย IJulia ซึ่งไม่ต้องใช้แบ็กเอนด์ GUI หรือใช้แบ็กเอนด์ Qt, wx หรือ GTK+ ของ Matplotlib ตามที่อธิบายไว้ด้านล่าง
เมื่อติดตั้ง Matplotlib แล้ว คุณสามารถใช้ Pkg.add("PyPlot")
ใน Julia เพื่อติดตั้ง PyPlot และการขึ้นต่อกันของ PyPlot
หากคุณตั้งค่า PyCall ให้ใช้แพ็คเกจ Conda.jl เพื่อติดตั้งส่วนตัว (ไม่ใช่ในระบบ PATH
) การแจกจ่าย Julia Python (ผ่าน Miniconda) จากนั้น PyPlot จะติดตั้ง Matplotlib โดยอัตโนมัติตามความจำเป็น
หากคุณกำลังติดตั้ง PyCall และ PyPlot เป็นครั้งแรก เพียงทำ ENV["PYTHON"]=""
ก่อนที่จะรัน Pkg.add("PyPlot")
มิฉะนั้น คุณสามารถกำหนดค่า PyCall ใหม่เพื่อใช้ Conda ผ่าน:
ENV [ " PYTHON " ] = " "
Pkg . build ( " PyCall " )
ครั้งต่อไปที่คุณนำเข้า PyPlot
มันจะบอกให้ Conda ติดตั้ง Matplotlib
บน MacOS คุณควรติดตั้ง XQuartz สำหรับ MacOS 10.9 หรือใหม่กว่า หรือติดตั้งการกระจาย Anaconda Python เพื่อให้ได้ PyPlot ที่ทำงานได้อย่างสมบูรณ์
MacOS 10.9 มาพร้อมกับ Python และ Matplotlib แต่ Matplotlib เวอร์ชันนี้มีค่าเริ่มต้นเป็นแบ็กเอนด์ Cocoa GUI ซึ่ง PyPlot ไม่รองรับ นอกจากนี้ยังมีแบ็กเอนด์ Tk ซึ่งได้รับการสนับสนุน แต่แบ็กเอนด์ Tk จะไม่ทำงานเว้นแต่คุณจะติดตั้ง XQuartz
หรือคุณสามารถติดตั้งการกระจาย Anaconda Python (ซึ่งรวมถึง ipython
และการขึ้นต่อกันของ IJulia อื่นๆ ด้วย)
มิฉะนั้น คุณสามารถใช้ตัวจัดการแพ็คเกจ Homebrew ได้:
brew install python gcc freetype pyqt
brew link --force freetype
export PATH= " /usr/local/bin: $PATH "
export PYTHONPATH= " /usr/local/lib/python2.7: $PYTHONPATH "
pip install numpy scipy matplotlib
(คุณอาจต้องการเพิ่มคำสั่ง export
สองคำสั่งลงในไฟล์ ~/.profile
ของคุณ เพื่อให้คำสั่งเหล่านั้นถูกดำเนินการโดยอัตโนมัติทุกครั้งที่คุณเริ่มเชลล์)
เมื่อติดตั้ง Matplotlib และ PyPlot แล้ว และคุณกำลังใช้สภาพแวดล้อม Julia ที่รองรับกราฟิก เช่น IJulia คุณสามารถพิมพ์ using PyPlot
และเริ่มเรียกใช้ฟังก์ชันใน matplotlib.pyplot API ตัวอย่างเช่น:
using PyPlot
# use x = linspace(0,2*pi,1000) in Julia 0.6
x = range ( 0 ; stop = 2 * pi , length = 1000 ); y = sin .( 3 * x + 4 * cos .( 2 * x));
plot (x, y, color = " red " , linewidth = 2.0 , linestyle = " -- " )
title ( " A sinusoidally modulated sinusoid " )
โดยทั่วไป อาร์กิวเมนต์ทั้งหมด รวมถึงอาร์กิวเมนต์ของคีย์เวิร์ด จะเหมือนกับใน Python ทุกประการ (แน่นอนว่ามีการแปลเล็กน้อย เช่น Julia ใช้ true
and nothing
แทน Python's True
and None
)
matplotlib.pyplot
API แบบเต็มนั้นกว้างขวางเกินกว่าจะอธิบายได้ที่นี่ ดูเอกสารประกอบ matplotlib.pyplot สำหรับข้อมูลเพิ่มเติม หมายเลขเวอร์ชัน Matplotlib จะถูกส่งกลับโดย PyPlot.version
เฉพาะ matplotlib.pyplot
API ที่ได้รับการบันทึกไว้ในปัจจุบันเท่านั้นที่จะถูกส่งออก หากต้องการใช้ฟังก์ชันอื่นๆ ในโมดูล คุณยังสามารถเรียก matplotlib.pyplot.foo(...)
เป็น plt.foo(...)
ได้ ตัวอย่างเช่น plt.plot(x, y)
ก็ใช้งานได้เช่นกัน (และ PyObject
แบบดิบสำหรับโมดูล matplotlib
ก็สามารถเข้าถึงได้ในชื่อ PyPlot.matplotlib
)
Matplotlib ค่อนข้างไม่สอดคล้องกันเกี่ยวกับการใช้อักษรตัวพิมพ์ใหญ่: มันมี contour3D
แต่ bar3d
ฯลฯ PyPlot เปลี่ยนชื่อฟังก์ชันดังกล่าวทั้งหมดเพื่อใช้ตัวพิมพ์ใหญ่ D (เช่น มี hist2D
, bar3D
และอื่น ๆ )
คุณต้องระบุคุณสมบัติบางอย่างของฟังก์ชัน Julia ในตัวอย่างชัดเจนด้วย โดยเฉพาะอย่างยิ่ง ต้องใช้ PyPlot.xcorr
, PyPlot.axes
และ PyPlot.isinteractive
เพื่อเข้าถึง matplotlib.pyplot.xcorr
ฯลฯ
หากคุณต้องการเข้าถึงฟังก์ชัน PyPlot ทั้งหมด ผ่านทาง plt.somefunction(...)
เท่านั้น เช่นเดียวกับปกติใน Python คุณสามารถ import PyPlot; const plt = PyPlot
ได้ import PyPlot; const plt = PyPlot
แทนที่จะ using PyPlot
คุณสามารถรับตัวเลขปัจจุบันเป็นวัตถุ Figure
(เสื้อคลุมรอบ matplotlib.pyplot.Figure
) โดยการเรียก gcf()
ประเภท Figure
รองรับมัลติมีเดีย I/O API ของ Julia ดังนั้นคุณสามารถใช้ display(fig)
เพื่อแสดง fig::PyFigure
และ show(io, mime, fig)
(หรือ writemime
ใน Julia 0.4) เพื่อเขียนลงในประเภท mime
ที่กำหนด สตริง (เช่น "image/png"
หรือ "application/pdf"
) ที่รองรับโดยแบ็กเอนด์ Matplotlib
หากคุณใช้ PyPlot จากพรอมต์ Julia แบบโต้ตอบ เช่น พรอมต์บรรทัดคำสั่ง Julia หรือสมุดบันทึก IJulia การลงจุดจะปรากฏขึ้นทันทีหลังจากประเมินฟังก์ชันการลง plot
( ฯลฯ )
อย่างไรก็ตาม หากคุณใช้ PyPlot จากสคริปต์ Julia ที่ทำงานแบบไม่โต้ตอบ (เช่น julia myscript.jl
) ดังนั้น Matplotlib จะถูกดำเนินการในโหมดที่ไม่โต้ตอบ: หน้าต่างพล็อตจะไม่เปิดขึ้นจนกว่าคุณจะเรียกใช้ show()
(เทียบเท่ากับ plt.show()
ในตัวอย่าง Python)
PyPlot สามารถใช้แบ็คเอนด์กราฟิก Julia ใดก็ได้ที่สามารถแสดงภาพ PNG, SVG หรือ PDF เช่น สภาพแวดล้อม IJulia หากต้องการใช้แบ็กเอนด์อื่น เพียงเรียก pushdisplay
ด้วย Display
ที่ต้องการ ดู API การแสดงมัลติมีเดียของ Julia เพื่อดูรายละเอียดเพิ่มเติม
ในทางกลับกัน คุณอาจต้องการใช้แบ็กเอนด์ Python Matplotlib ตัวใดตัวหนึ่งเพื่อเปิดหน้าต่างแบบโต้ตอบสำหรับแต่ละพล็อต (สำหรับการซูมแบบโต้ตอบ การแพนกล้อง ฯลฯ) คุณสามารถทำได้ทุกเมื่อโดยเรียกใช้:
pygui ( true )
เพื่อเปิด GUI ที่ใช้ Python (ถ้าเป็นไปได้) สำหรับแปลงถัดไป ในขณะที่ pygui(false)
จะกลับไปที่แบ็กเอนด์ Julia แม้ว่า Python GUI จะทำงานอยู่ คุณสามารถแสดงตัวเลขปัจจุบันด้วยแบ็กเอนด์ Julia ได้โดยการรัน display(gcf())
หากไม่มีแบ็กเอนด์กราฟิกของ Julia เมื่อนำเข้า PyPlot ดังนั้น pygui(true)
จะเป็นค่าเริ่มต้น
PyPlot รองรับเฉพาะ Tk, wxWidgets, GTK+ (เวอร์ชัน 2 หรือ 3) และ Qt (เวอร์ชัน 4 หรือ 5; ผ่าน PyQt5, PyQt4 หรือ PySide) เท่านั้น (แน่นอนว่าคุณต้องติดตั้งหนึ่งในชุดเครื่องมือเหล่านี้สำหรับ Python ก่อน) ตามค่าเริ่มต้น PyPlot จะเลือกหนึ่งในชุดเครื่องมือเหล่านี้เมื่อเริ่มต้นระบบ (ขึ้นอยู่กับสิ่งที่คุณได้ติดตั้ง) แต่คุณสามารถบังคับให้เลือกชุดเครื่องมือเฉพาะได้โดยการนำเข้า โมดูล PyCall และใช้ฟังก์ชัน pygui
เพื่อตั้งค่าแบ็กเอนด์ Python ก่อนที่ จะนำเข้า PyPlot:
using PyCall
pygui (gui)
using PyPlot
โดยที่ gui
สามารถเป็นหนึ่งใน :tk
, :gtk3
, :gtk
, :qt5
, :qt4
, :qt
หรือ :wx
คุณยังสามารถตั้งค่าเริ่มต้นผ่านพารามิเตอร์ Matplotlib rcParams['backend']
ในไฟล์ matplotlibrc ของคุณ
โมดูล PyPlot ยังส่งออกฟังก์ชันและประเภทบางอย่างตามโมดูล matplotlib.colors และ matplotlib.cm เพื่อลดความซับซ้อนในการจัดการแผนที่สี (ซึ่งใช้เพื่อกำหนดค่าให้กับสีในประเภทพล็อตต่างๆ) โดยเฉพาะอย่างยิ่ง:
ColorMap
: wrapper รอบประเภท matplotlib.colors.Colormap มีตัวสร้างดังต่อไปนี้:
ColorMap{T<:Colorant}(name::String, c::AbstractVector{T}, n=256, gamma=1.0)
สร้างแผนผังสี n
-component โดยการประมาณค่าสีในอาร์เรย์ c
ของ Colorant
s แบบเชิงเส้น (จาก แพ็คเกจ ColorTypes.jl) หากคุณต้องการสร้าง name
โดยอัตโนมัติ ให้เรียก ColorMap(c, n=256, gamma=1.0)
แทน อีกทางหนึ่ง แทนที่จะส่งอาร์เรย์ของสี คุณสามารถส่งเมทริกซ์ 3 หรือ 4 คอลัมน์ของส่วนประกอบ RGB หรือ RGBA ตามลำดับ (คล้ายกับ ListedColorMap ใน Matplotlib)
แมปสีทั่วไปยิ่งขึ้นอาจถูกกำหนดโดยการส่งผ่านอาร์เรย์ของสิ่งอันดับ (x,y0,y1) สำหรับส่วนประกอบอัลฟ่าสีแดง เขียว น้ำเงิน และ (เป็นทางเลือก) ตามที่กำหนดโดยตัวสร้าง matplotlib.colors.LinearSegmentedColormap ผ่าน: ColorMap{T<:Real}(name::String, r::AbstractVector{(T,T,T)}, g::AbstractVector{(T,T,T)}, b::AbstractVector{(T,T,T)}, n=256, gamma=1.0)
หรือ ColorMap{T<:Real}(name::String, r::AbstractVector{(T,T,T)}, g::AbstractVector{(T,T,T)}, b::AbstractVector{(T,T,T)}, alpha::AbstractVector{(T,T,T)}, n=256, gamma=1.0)
ColorMap(name::String)
ส่งคืนแผนผังสีที่มีอยู่ (ที่ลงทะเบียน) ซึ่งเทียบเท่ากับ matplotlib.pyplot.get_cmap( name
)
ออบเจ็กต์ matplotlib.colors.Colormap
ที่ส่งคืนโดยฟังก์ชัน Python จะถูกแปลงเป็นประเภท ColorMap
โดยอัตโนมัติ
get_cmap(name::String)
หรือ get_cmap(name::String, lut::Integer)
เรียกใช้ฟังก์ชัน matplotlib.pyplot.get_cmap
register_cmap(c::ColorMap)
หรือ register_cmap(name::String, c::ColorMap)
เรียกใช้ฟังก์ชัน matplotlib.colormap.register
get_cmaps()
ส่งคืน Vector{ColorMap}
ของแผนผังสีที่ลงทะเบียนในปัจจุบัน
โปรดทราบว่า เนื่องจากสภาพแวดล้อมการแสดงผลที่รองรับ SVG เช่น ออบเจ็กต์ IJulia, ColorMap
และ Vector{ColorMap}
จะแสดงเป็นกราฟิก ลอง get_cmaps()
!
แพ็คเกจ PyPlot ยังนำเข้าฟังก์ชันจากชุดเครื่องมือ mplot3d ของ Matplotlib ซึ่งแตกต่างจาก Matplotlib ตรงที่คุณสามารถสร้างพล็อต 3 มิติได้โดยตรงโดยไม่ต้องสร้างวัตถุ Axes3d ก่อน เพียงแค่เรียกหนึ่งใน: bar3D
, contour3D
, contourf3D
, plot3D
, plot_surface
, plot_trisurf
, plot_wireframe
หรือ scatter3D
(เช่นเดียวกับ text2D
, text3D
) อย่างแน่นอน เช่นเดียวกับวิธีการที่มีชื่อสอดคล้องกันของ Axes3d นอกจากนี้เรายังส่งออกคำ surf
ความหมายที่คล้ายกับ Matlab สำหรับ plot_surface
(หรือ plot_trisurf
สำหรับอาร์กิวเมนต์ 1d-array) และ mesh
สำหรับ plot_wireframe
ตัวอย่างเช่น คุณสามารถทำสิ่งต่อไปนี้
surf ( rand ( 30 , 40 ))
เพื่อพล็อตตาข่ายพื้นผิวแบบสุ่ม 30×40
คุณยังสามารถสร้างแผนย่อยด้วยแกน 3 มิติได้อย่างชัดเจนผ่านตัวอย่างเช่น subplot(111, projection="3d")
เหมือนกับใน Matplotlib แต่ก่อนอื่นคุณต้องเรียกใช้ฟังก์ชัน using3D()
เพื่อให้แน่ใจว่า mplot3d โหลดแล้ว (สิ่งนี้เกิดขึ้น โดยอัตโนมัติสำหรับ plot3D
ฯลฯ) ตัวสร้าง Axes3D
และโมดูล art3D จะถูกส่งออกด้วย
Matplotlib ช่วยให้คุณใช้สมการ LaTeX ในป้ายกำกับพล็อต ชื่อ และอื่นๆ ได้ง่ายๆ โดยการใส่สมการด้วยเครื่องหมายดอลลาร์ ( $ ... $
) ภายในสตริง อย่างไรก็ตาม การพิมพ์สมการ LaTeX ในตัวอักษรสตริงของ Julia เป็นเรื่องที่น่าอึดอัดใจ เนื่องจากการหลบหนีเป็นสิ่งจำเป็นเพื่อป้องกันไม่ให้ Julia ตีความเครื่องหมายดอลลาร์และแบ็กสแลชเอง ตัวอย่างเช่น สมการ LaTeX $alpha + beta$
จะเป็นสตริงตามตัวอักษร "$\alpha + \beta$"
ในภาษา Julia
เพื่อให้สิ่งนี้ง่ายขึ้น PyPlot ใช้แพ็คเกจ LaTeXStrings เพื่อจัดเตรียมประเภท LaTeXString
ใหม่ที่สร้างขึ้นผ่าน L"...."
โดยไม่ต้องหลีกเลี่ยงเครื่องหมายแบ็กสแลชหรือเครื่องหมายดอลลาร์ ตัวอย่างเช่น เราสามารถเขียน L"$alpha + beta$"
สำหรับสมการที่กล่าวมาข้างต้น และคุณจึงสามารถทำสิ่งต่างๆ เช่น:
title ( L " Plot of $ G amma_3(x)$ " )
หากสตริงของคุณมี เพียง สมการ คุณสามารถละเครื่องหมายดอลลาร์ได้ เช่น L"alpha + beta"
และเครื่องหมายเหล่านั้นจะถูกเพิ่มโดยอัตโนมัติ เพื่อประโยชน์เพิ่มเติม LaTeXString
จะแสดงเป็นสมการที่เรนเดอร์ใน IJulia โดยอัตโนมัติ ดูแพ็คเกจ LaTeXStrings สำหรับข้อมูลเพิ่มเติม
ตามค่าเริ่มต้น แปลงใน IJulia จะถูกส่งไปยังสมุดบันทึกเป็นรูปภาพ PNG อีกทางเลือกหนึ่ง คุณสามารถบอกให้ PyPlot แสดงแปลงในเบราว์เซอร์เป็นรูปภาพ SVG ซึ่งมีข้อดีคือไม่ขึ้นกับความละเอียด (เพื่อให้แสดงโดยไม่มีพิกเซลที่ความละเอียดสูง เช่น หากคุณแปลงสมุดบันทึก IJulia เป็น PDF) โดย วิ่ง:
PyPlot . svg ( true )
นี่ไม่ใช่ค่าเริ่มต้นเนื่องจากแปลง SVG ในเบราว์เซอร์จะแสดงได้ช้ากว่ามาก (โดยเฉพาะสำหรับแปลงที่ซับซ้อน) และอาจแสดงไม่ถูกต้องในบางเบราว์เซอร์ที่รองรับ SVG แบบบั๊กกี้ PyPlot.svg()
วิธีการคืนค่าว่าจอแสดงผล SVG เปิดใช้งานอยู่หรือไม่
โปรดทราบว่าการดำเนินการนี้แยกจากการส่งออกแปลงข้อมูลด้วยตนเองเป็น SVG หรือรูปแบบอื่นโดยสิ้นเชิง ไม่ว่า PyPlot จะใช้ SVG สำหรับการแสดงผลเบราว์เซอร์หรือไม่ คุณสามารถส่งออกพล็อตไปยัง SVG ได้ตลอดเวลาโดยใช้คำสั่ง Matplotlib savefig เช่น savefig("plot.svg")
คุณสามารถกลายพันธุ์พจนานุกรม rcParams
ที่ Matplotlib ใช้สำหรับพารามิเตอร์ส่วนกลางตามตัวอย่างนี้:
rcParams = PyPlot . PyDict (PyPlot . matplotlib. " rcParams " )
rcParams[ " font.size " ] = 15
(หากคุณใช้ PyPlot.matplotlib.rcParams
แทน PyCall จะทำสำเนาพจนานุกรมเพื่อไม่ให้ Python rcParams
ได้รับการแก้ไข)
โมดูลนี้เขียนโดย Steven G. Johnson