【譯】Matplotlib:plotting

前言python

本教程源於Scipy Lecture Notes,URL:http://www.scipy-lectures.org/編程

本教程如有翻譯不當或概念不明之處,請你們留言,博主及時更正,以便後來的用戶更好更溫馨地學習本教程。數組

轉載本文請註明出處,謝謝。dom

感謝ide

很是感謝Bill Wing和Christoph Deil的審閱和校訂。函數

做者:Nicolas Rougier, Mike Müller, Gaël Varoquaux學習

本章內容:ui

4.1    介紹spa

4.2    簡單繪圖命令行

4.3    圖形,子圖,座標軸和刻度

4.4    其餘類型的圖形:示例和練習

4.5    本教程以外的內容

4.6    快速參考

4.1  介紹

Matplotlib多是二維圖形中最經常使用的Python包。它提供了一個很是快的可視化Pyhton數據的方法和許多可供發佈的格式化圖形。接下來,咱們將要在包含大多數常見狀況的交互模式下探索Matplotlib。

4.1.1  IPython和Matplotlib模式

Ipython是一個加強的交互式Python Shell。它有許多有趣的功能,包括命名輸入和輸出、訪問Shell命令、改進調試等更多內容。它是Pyhton中科學計算工做流的核心,與Matplotlib結合一塊兒使用。

有關Matlab/Mathematica相似功能的交互式Matplotlib會話,咱們使用IPython和它的特殊Matplotlib模式,使可以非阻塞繪圖。

Ipython console  當使用IPython控制檯時,咱們以命令行參數--matplotlib啓動它(-pylab命令用在很是老的版本中)

IPthon notebook  在IPthon notebook中,咱們在notebook的起始處插入如下魔法函數:%matplotlib inline

4.1.2  pyplot

pyplot爲matplotlib面向對象的繪圖庫提供了一個程序接口。它以Matlab爲關係模型。所以,plot中的大多數繪圖命令都具備相似的Matlab模擬參數。重要的命令將使用交互示例進行說明。

from matplotlib import pyplot as plt

 4.2  簡單繪圖

在本節中,咱們將在同一個圖形中繪製餘弦和正弦函數,咱們將從默認設置開始,逐步充實圖形,使其變得更好。

第一步:獲取正弦和餘弦函數的數據

import numpy as np

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)

X如今是一個numpy數組,有256個值,範圍從-π到+π(包括),C是餘弦(256個值),S是正弦(256個值)。

要運行該示例,你能夠在IPython交互式會話中鍵入它:

$ ipython --pylab

這將咱們帶到IPython命令提示符下:

IPython 0.13 -- An enhanced Interactive Python.
? -> Introduction to IPython's features.
%magic -> Information about IPython's 'magic' % functions.
help -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.
Welcome to pylab, a matplotlib-based Python environment.
For more information, type 'help(pylab)'.

你能夠下載每一個例子,使用常規的Python命令運行它,可是這樣作你會失去交互數據操做的便利性。

$ python exercice_1.py

你也能夠經過點擊相應的圖形來獲取每一個步驟的源。

4.2.1  使用默認設置繪圖

Documentation

  • plot tutorial
  • plot() command
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)

plt.plot(X, C)
plt.plot(X, S)

plt.show()

 4.2.2  示例的默認設置

 

Documentation

  • Customizing matplotlib
import numpy as np
import matplotlib.pyplot as plt

# Create a figure of size 8x6 inches, 80 dots per inch
plt.figure(figsize=(8, 6), dpi=80)

# Create a new subplot from a grid of 1x1
plt.subplot(1, 1, 1)

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)

# Plot cosine with a blue continuous line of width 1 (pixels)
plt.plot(X, C, color="blue", linewidth=1.0, linestyle="-")

# Plot sine with a green continuous line of width 1 (pixels)
plt.plot(X, S, color="green", linewidth=1.0, linestyle="-")

# Set x limits
plt.xlim(-4.0, 4.0)

# Set x ticks
plt.xticks(np.linspace(-4, 4, 9, endpoint=True))

# Set y limits
plt.ylim(-1.0, 1.0)

# Set y ticks
plt.yticks(np.linspace(-1, 1, 5, endpoint=True))

# Save figure using 72 dots per inch
# plt.savefig("exercice_2.png", dpi=72)

# Show result on screen
plt.show()

4.2.3  更改線條顏色和寬度

Documentation

  • Controlling line properties
  • Line API

第一步,咱們要將餘弦函數設置爲藍色,正弦函數設置爲紅色,而且將它們都設置爲稍微粗的線型。咱們也會稍微改變一下圖形的大小,使它更寬闊一些。

...
plt.figure(figsize=(10, 6), dpi=80)
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")
...

4.2.4  設置邊界

 

Documentation

  • xlim() command
  • ylim() command

當前圖形的邊界有點緊湊,咱們想要預留一些空間,以便清楚地查看全部數據點。

...
plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.ylim(C.min() * 1.1, C.max() * 1.1)
...

4.2.5  設置刻度

Documentation

  • xticks() command
  • yticks() command
  • Tick container
  • Tick locating and formatting

當前刻度不太理想,由於它們未顯示正弦函數和餘弦函數有趣的值,咱們將更改它們,以便只顯示這些值。

...
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
plt.yticks([-1, 0, +1])
...

4.2.6  設置刻度標籤

 

Documentation

  • Working with text
  • xticks() command
  • yticks() command
  • set_xticklabels()
  • set_yticklabels()

刻度如今被正確放置,可是它們的標籤不是很明確。咱們可能猜想3.142表明π,它應該更好地使其明確出來。當咱們設置刻度值時,咱們還能夠在第二個參數列表中提供相應的標籤。注意,咱們將使用LATEX語法,容許標籤更好地呈現出來。

...
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1, 0, +1],
[r'$-1$', r'$0$', r'$+1$'])
...

4.2.7  移動軸線

 

Documentation

  • Spines
  • Axis container
  • Transformations tutorial

軸線是鏈接軸刻度線而且標記數據區域邊界的線。 他們能夠被放置在任意位置,直到如今,他們在軸的邊界。 咱們將改變它,由於咱們想把它們放置在中間。 由於它有四個邊界(頂部/底部/左側/右側),咱們將它們的顏色設置爲none來丟棄頂部和右側邊界,咱們移動底部和左側的邊界將數據空間座標變爲原點。

...
ax = plt.gca() # gca stands for 'get current axis'
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
...

4.2.8  添加圖例

 

Documentation

  • Legend guide
  • legend() command
  • Legend API

 讓咱們在左上角添加一個圖例,這隻須要將label(這將被用在圖例框中)關鍵字參數添加到plot命令中。

...
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cosine")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label="sine")
plt.legend(loc='upper left')
...

4.2.9  註釋一些點

 

Documentation

  • Annotating axis
  • annotate() command

讓咱們使用annotate命令註釋一些有趣的點。 咱們選擇了數值2π/3,咱們想註釋正弦和餘弦。 首先,咱們將在曲線上繪製一個標記以及一條直虛線。而後,咱們將使用annotate命令顯示一些帶有箭頭的文本。

...

t = 2 * np.pi / 3
plt.plot([t, t], [0, np.cos(t)], color='blue', linewidth=2.5, linestyle="--")
plt.scatter([t, ], [np.cos(t), ], 50, color='blue')

plt.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
xy=(t, np.sin(t)), xycoords='data',
xytext=(+10, +30), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

plt.plot([t, t],[0, np.sin(t)], color='red', linewidth=2.5, linestyle="--")
plt.scatter([t, ],[np.sin(t), ], 50, color='red')

plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

...

4.2.10  問題在於細節

 

Documentation

  • Artists
  • BBox

因爲藍色和紅色的線,刻度標籤如今幾乎不可見。咱們能夠放大它們,咱們也能夠調整它們的屬性,以便它們能夠被呈如今半透明的白色背景中。這會容許咱們看到數據和標籤。

...
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(16)
label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65))
...

4.3  圖形、子圖、座標軸和刻度

matplotlib中的"figure"表示用戶界面中的整個窗口。 在這個figure中能夠有多個「subplot」。

到目前爲止,咱們已經明確地建立了圖形和座標軸。 這對於快速繪圖很方便。 咱們可使用更多的控制來顯示圖形、子圖和座標軸,雖然子圖將繪圖定位在規則網格中,軸線容許在圖中自由放置。根據你的意圖,這二者都是可用的。咱們已經使用圖形和子圖來工做了,可是咱們沒有明確地調用它們。當咱們調用plot時,matplotlib調用gca()獲取當前座標軸,同時,gca依次調用gcf()獲取當前圖形,若是None,它調用figure()建立一個figure對象,嚴格的說,是建立一個subplot(111)。下面讓咱們來看一看詳細狀況。

4.3.1  圖形

 一個figure對象是標題爲"Figure#"的GUI窗口,Figure命名是以1開始,與以0開始索引的常規Python方式大相徑庭。這顯然是Matlab風格。如下有幾個參數肯定figure對象的外觀:

Argument Default Description
num 1 number of figure
figsize figure.figsize figure size in in inches (width, height)
dpi figure.dpi resolution in dots per inch
facecolor figure.facecolor color of the drawing background
edgecolor figure.edgecolor color of edge around the drawing background
frameon Ture draw figure frame or not

默認值能夠在源文件中指定,而且在大多數時間都會使用,只有圖形的編號常常改變。

與其餘對象同樣,你能夠設置figure對象的屬性,也可使用帶有設置選項的setp方法設置figure。

使用GUI窗口時,你能夠經過單擊右上角的X按鈕關閉figure對象,可是你能夠經過調用close已編程方式關閉figure。根據不一樣的參數,它關閉:(1)當前figur(無參數);(2)指定參數(figure數字或實例做爲參數);(3)全部figure(all做爲參數)。

plt.close(1) # Closes figure 1

4.3.2  子圖

使用子圖能夠在常規網格中排列圖,你須要指定行數、列數以及圖區。注意,gridspec命令是一個更強大的選擇。

 

4.3.3  軸線

 座標軸很是相似於子圖,但容許將繪圖放置在figure中的任何位置。因此,若是咱們想把一個較小的圖形放在一個更大的圖裏面,咱們將用axes方法這樣作。

4.3.4  刻度

格式友好的刻度是準備發佈figure重要的組成部分,Matplotlib爲刻度提供了一個徹底可配置的系統。有刻度定位符指定刻度應該出如今那裏和刻度格式化給刻度你想要的外觀,主要刻度和次要刻度能夠獨立的被定位和格式化,默認的次要刻度不顯示,即它們只有一個空列表,由於它是NullLocator(見下文)。

刻度定位符

刻度定位符控制刻度的位置,它們設置以下:

ax = plt.gca()
ax.xaxis.set_major_locator(eval(locator))

 

有幾種定位器適用於不一樣類型的要求:

全部這些定位器派生自基類matplotlib.ticker.Locater。你可使用本身的派生定位器,將刻度做爲日期處理可能特別棘手。所以,matplotlib在matplotlib.dates提供了特別的定位符。

4.4  其餘類型的圖形:示例和練習

4.4.1  常規圖(Regular Plots)

 

你須要使用fill_between命令。

從如下代碼開始,嘗試在右側從新生成圖表,注意填充區域:

n = 256
X = np.linspace(-np.pi, np.pi, n, endpoint=True)
Y = np.sin(2 * X)

plt.plot(X, Y + 1, color='blue', alpha=1.00)
plt.plot(X, Y - 1, color='blue', alpha=1.00)

點擊圖形查看解決方法。

 

4.4.2  散點圖(Scatter Plots)

 

顏色由(X,Y)的角度給定。

從如下代碼開始,嘗試在右側從新生成圖表,注意標記大小,顏色和透明度:

n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)

plt.scatter(X,Y)

點擊圖形查看解決方法。

 

4.4.3  柱狀圖(Bar Plots)

 

你須要關注文本對齊方式。

從如下代碼開始,嘗試在右側經過增長紅色柱形條從新生成圖形:

n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)

plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')

for x, y in zip(X, Y1):
    plt.text(x + 0.4, y + 0.05, '%.2f ' % y, ha='center', va='bottom')

plt.ylim(-1.25, +1.25)

點擊圖形查看解決方法。

 

4.4.4  等高線圖(Contour Plots)

 

你須要使用clabel命令。

從如下代碼開始,嘗試在右側從新生成圖形,注意色彩映射(在下面查看色彩映射表):

def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 -y ** 2)

n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X, Y = np.meshgrid(x, y)

plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap='jet')
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)

點擊圖形查看解決方法。

 

4.4.5  顯示圖像(Imshow)

 

你須要關注imshow命令裏圖像的原點且要使用顏色條。

從如下代碼開始,嘗試在右側從新生成圖形,注意色彩映射,圖形插值和原點。

def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

n = 10
x = np.linspace(-3, 3, 4 * n)
y = np.linspace(-3, 3, 3 * n)
X, Y = np.meshgrid(x, y)
plt.imshow(f(X, Y))

點擊圖形查看解決方法。

 

4.4.6  餅圖(Pie Plots)

 

你須要修改Z。

從如下代碼開始,嘗試在右側從新生成圖形,注意顏色和分片大小。

Z = np.random.uniform(0, 1, 20)
plt.pie(Z)

點擊圖形查看解決方法。

 

4.4.7  向量場圖(Quiver Plots)

 

n = 8
X, Y = np.mgrid[0:n, 0:n]
plt.quiver(X, Y)

 點擊圖形查看解決方法。

 

4.4.8  網格線(Grids)

 

axes = plt.gca()
axes.set_xlim(0, 4)
axes.set_ylim(0, 3)
axes.set_xticklabels([])
axes.set_yticklabels([])

點擊圖形查看解決方法。

 

4.4.9  多圖(Multi Plots)

 

plt.subplot(2, 2, 1)
plt.subplot(2, 2, 3)
plt.subplot(2, 2, 4)

 點擊圖形查看解決方法。

 

4.4.10  極軸(Polar Axis)

 

plt.axes([0, 0, 1, 1])

N = 20
theta = np.arange(0., 2 * np.pi, 2 * np.pi / N)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
bars = plt.bar(theta, radii, width=width, bottom=0.0)

for r, bar in zip(radii, bars):
    bar.set_facecolor(cm.jet(r / 10.))
    bar.set_alpha(0.5)

點擊圖形查看解決方法。

 

4.4.11  三維圖(3D Plots)

 

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='hot')

點擊圖形查看解決方法。

 

4.4.12  文本(Text)

相關文章
相關標籤/搜索