首頁  >  文章  >  後端開發  >  python繪圖庫的基本操作方法介紹

python繪圖庫的基本操作方法介紹

Y2J
Y2J原創
2018-05-21 11:31:426078瀏覽

這篇文章主要為大家介紹了利用numpy+matplotlib繪圖的基本操作,文中介紹的非常詳細,對大家學習matplotlib繪圖具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。

簡述

Matplotlib是基於python的2D畫圖庫,能夠用python腳本方便的畫出折線圖,直方圖,功率譜圖,散佈圖等常用圖表,而且語法簡單。具體介紹見matplot官網。

Numpy(Numeric Python)是一個模仿matlab的對python數值運算進行的擴展,提供了許多高級的數值程式設計工具,如:矩陣資料類型、向量處理,以及精密的運算庫。專為進行嚴格的數位處理而產生,據說自從他出現了以後,NASA就把很多原來用fortran和matlab做的工作交給了numpy來做了,可見其強大。 。 。他的官網在這裡,具體的資料都在裡面。

安裝

$sudo apt-get install python-matplotlib
$sudo apt-get install python-numpy

(牛頓大法好~)

使用

matplotlib可以在腳本中使用,不過如果在ipython中使用則會更加炫(直接添加–pylab參數可以免去導包的過程),而且能得到類似Matlab/Mathematica一樣的功能,即時輸入,即時輸出。個人覺得說白了他就是模仿Matlab/Mathematica的,但是的確比前者更方便程式設計。

很多情況下matplot需要搭配numpy包一起用,關於numpy包我不打算分開來說,用到的時候提一下就行。有一點要注意的是,numpy套件通常是這樣導入的:

import numpy as np

會給他一個叫np的別名,而且這幾乎已經是約定俗成了。

在python或ipython中輸入help(*需要查找的函數*) 就行(當然需要先導入下包)。

第一個圖片

需要匯入的套件:

import numpy as np
from pylab import *

#第一個函數圖像

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

有matlab基礎的同學肯定不陌生。 。 。是的,這兩個模組的組合幾乎就跟matlab的用法無二。 。

      1、先用np.linspace方法產生一個陣列X,這個陣列是從$-\pi$開始到$\pi$的總共包含256個元素的數組,endpoint參數表示是否包含首尾端點(他的值是True或False,首字母要大寫。。。)。當然,這個數組就是一個普通的數組了,跟其他數組沒有差別。

      2、然後用np.cos()np.sin()方法作用在X數組上,對於X中的每一個元素進行計算,產生結果數組。 (免去了迭代的過程)。

      3、接著呼叫pylab的plot方法,第一個參數是橫座標數組,第二個參數是縱座標數組,其他參數暫且不談。這樣他會生成一個預設的圖表了。 (不會立刻顯示)

      4、當然,最後還要呼叫show方法來顯示圖表。

      5、結果:

#圖表的名字叫做figure1,左下方有幾個按鈕#,都是很實用的東西,右下角會顯示目前滑鼠左邊,也很方便。

圖表佈局和座標分佈

#每一個圖表都是在一個figure裡面,我們可以透過如下指令產生一個空的figure:

figure(figsize=(8,6), dpi=80)

這裡參數的順序沒有要求,但是一定要加上參數名,因為他是根據參數名來區別每個參數的,是一種跟C語言類型不同的函數。 figsize參數表示figure的寬高比,然後dpi表示每一份佔的長度,例如這裡就表示圖像是640x480的。

輸出指令之後會立刻出現一個窗口,接下來所有的plot指令都會立刻顯示在這個窗口上而不用再輸入show指令了。

一個figure裡也能顯示多個圖表,我們可以用以下函數來分割一個figure:

subplot(3,4,6)

這樣就會把當前的figure分割成3行4列的表,而啟動其中的第6張,即第2行第3張。以後的plot都是在這一子表上產生的,如果需要更換則可以重新輸入subplot指令來決定其新的位置。

除此之外,如果我們對圖表顯示的範圍不滿意,我們也可以直接調整圖表的座標範圍:

xlim(-4.0,4.0)
ylim(-1.0,1.0)

这就表示x轴的范围设置在-4到4,y轴的范围设置在-1到1。当然,如果是想相对的进行修改我们可以利用下numpy数组的min和max方法。比如X.min() 这样的东西。

如果对坐标显示的密度啊什么的不满意,我们也可以调节他的标注点:

xticks(np.linspace(-4,4,9,endpoint=True))
yticks(np.linspace(-1,1,5,endpoint=True))

对于xticks和yticks,我们实际上可以传入任意的数组,这里不过是为了方便而用numpy快速生成的等差数列。

当然,我们也可以给标注点进行任意的命名,像下面这样:

xticks([1,2,3,4,5],['one','two','three','four','five'])

效果也很好想象,就不贴图了。需要注意的是这里也可以支持LaTex语法,将LaTex引用在两个$之间就可以了。(关于LaTex)

这里也有个小窍门,就是如果想不显示标注的话,我们就可以直接给xticks赋一个空的数组。

更改色彩和线宽

我们可以在画plot的时候用如下方法指定他的颜色和线宽:

plot(X, C, color='#cadae3', linestyle='-',linewidth=1.3, marker='o', markerfacecolor='blue', markersize=12,)

同样,这里参数的顺序不重要,名字才重要。

color参数可以指定RGB的色相,也可以用一些默认的名字,比如red blue之类的。

linestyle参数则指定了线的样式,具体参照以下样式:

参数 样式
‘-‘ 实线
‘–' 虚线
‘-.' 线-点
‘:' 点虚线

linewidth参数指定折线的宽度,是个浮点数。

marker参数指定散点的样式,具体参照以下样式:

参数 样式
‘.' 实心点
‘o' 圆圈
‘,' 一个像素点
‘x' 叉号
‘+' 十字
‘*' 星号
‘^' ‘v' ‘545710c31060c68aa33a6f2f6c6a04be' 三角形(上下左右)
‘1' ‘2' ‘3' ‘4' 三叉号(上下左右)

markerfacecolor参数指定marker的颜色

markersize参数指定marker的大小

这样就基本上能够自定义任何的折线图、散点图的样式了。

移动轴线

这段有点小复杂,暂时不想具体了解奇奇怪怪的函数调用,姑且先记录下用法和原理:

ax = gca()
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))

我们知道一张图有上下左右四个轴线,这里我们把右边和上边的轴线颜色调为透明,然后把下边设置到y轴数据为0的地方,把左边设置到x轴数据为0的地方。这样我们就能根据自己想要位置来调节轴线了。

比如下面这段官方的代码:

# -----------------------------------------------------------------------------
# Copyright (c) 2015, Nicolas P. Rougier. All Rights Reserved.
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
# -----------------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(8,5), dpi=80)
ax = plt.subplot(111)
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))
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")
plt.xlim(X.min()*1.1, X.max()*1.1)
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.ylim(C.min()*1.1,C.max()*1.1)
plt.yticks([-1, 0, +1],
 [r'$-1$', r'$0$', r'$+1$'])
plt.show()

显示的结果就是:

图例和注解

图例十分简单,下述代码就可以解决:

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

在plot里指定label属性就好了,最后调用下legend函数来确定图例的位置,一般就是'upper left'就好了。

注解就有点麻烦了,要用到annotate命令,挺复杂的,暂时是在不想看,姑且贴一段完整的代码和效果图吧:

# -----------------------------------------------------------------------------
# Copyright (c) 2015, Nicolas P. Rougier. All Rights Reserved.
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
# -----------------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(8,5), dpi=80)
ax = plt.subplot(111)
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))
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
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.xlim(X.min()*1.1, X.max()*1.1)
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.ylim(C.min()*1.1,C.max()*1.1)
plt.yticks([-1, +1],
  [r'$-1$', r'$+1$'])
t = 2*np.pi/3
plt.plot([t,t],[0,np.cos(t)],
  color ='blue', linewidth=1.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=1.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"))
plt.legend(loc='upper left', frameon=False)
plt.savefig("../figures/exercice_9.png",dpi=72)
plt.show()

效果图:

还是十分高能的。。。

总结

【相关推荐】

1. Python免费视频教程

2. Python基础入门教程

3. Python在数据科学中的应用

以上是python繪圖庫的基本操作方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn