matplotlib是python中的一個畫圖庫,繼承了matlib(從名字上也看得出來)的優勢和語法,因此對於熟悉matlib的用戶來講是十分友好的。python
pylab和pyplotide
關於pylab和pyplot,人們作過很多的討論。這兩個模塊有哪些不一樣呢?pylab模塊跟matplotlib一塊兒安裝,而pyplot則是matplotlib的內部模塊。二者的導入方法有所不一樣,可選擇其中一種進行導入。函數
from pylab import *字體
#或對象
import matplotlib.pyplot as plt繼承
import numpy as np圖片
pylab在同一命名空間整合了pyplot和Numpy的功能,所以無需再單獨導入Numpy。更進一步來講,導入pylab後,pyplot和Numpy的函數就能夠直接調用,而不用再指定其所屬模塊(命名空間),從而使得matplotlib開發環境更像是Matlab。ip
plot(x,y)開發
array([1,2,3,4])qt
#而不用指定模塊名稱
plt.plot()
np.array([1,2,3,4])
大多狀況下,咱們更樂意使用pyplot模塊。
線狀圖
這裏我使用jupyter來進行演示
ipython qtconsole --matplotlib inline
用matplotlib生成這個圖表很簡單,一行代碼就能搞定
plt.plot([1,2,3,4])
plt.show()
1.png
如圖所示,生成了一個Line2D對象。該對象爲一條直線,它表示圖表中各數據點的線性延伸趨勢。咱們能夠看出,列表中的數據直接被做爲y軸的值展現了出來,x周是從0開始的,因此咱們要看一個數據的折線圖,只用輸入一個list便可。
但咱們能夠看出這個圖可能還很簡陋,好比有以下幾個問題:
y軸顯示爲啥是0.5爲步長間隔,我想以1爲步長間隔
我想控制x軸展現的值,而不是從0開始
圖過小了,可否控制大小
x軸和y軸字過小了,可否控制大小
給x軸和y軸命個名吧
沒有網格看不清
沒有圖例
給線狀圖標上點
我想保存圖片到本地
怎麼畫子圖呢
接下來咱們就一個一個解決。
1.設置x軸和y軸步長間隔
控制x軸,y軸顯示的值,有兩個參數
xticks(ticks, [labels], **kwargs)
yticks(ticks, [labels], **kwargs)
ticks:控制顯示的位置,也就是顯示那幾個值,這幾個值必須在y值數據的範圍內,這裏也就是[1,4]這個範圍。
[labels]:控制顯示在對應位置的值,能夠是數也能夠是字符。
y = [1,2,3,4]
step = 1
plt.yticks([i for i in y if i%step == 0])
plt.plot(y)
2.png
2.x軸展現的值
這裏展現了座標軸顯示字符的狀況。
注意第五行,我改爲了[1,2,3,3.5,4],因此顯示出來就多了個3.5。
y = [1,2,3,4]
scale_ls = range(4)
index_ls = ["富強","民主","文明","和諧"]
plt.xticks(scale_ls,index_ls)
plt.yticks([1,2,3,3.5,4])
plt.plot(y)
Snipaste_2018-10-10_13-17-55.png
3.控制圖表大小
控制圖表的大小要用到的幾個方法
rcParams:這個參數是用來設置一些配置參數的,好比這裏我就用到了大小和dpi
figure.figsize:控制大小,參數爲一個二元組(x,y),即長、寬
figure.dpi:控制dpi
plt.rcParams['figure.figsize'] = (10,5)
plt.rcParams['figure.dpi'] = 200
y = [1,2,3,4]
scale_ls = range(4)
index_ls = ["富強","民主","文明","和諧"]
plt.xticks(scale_ls,index_ls)
plt.yticks([1,2,3,3.5,4])
plt.plot(y)
這裏能夠看出更大更清晰了
3.png
4.調節x軸和y軸字體大小
這裏控制字體大小用到的也是xticks和yticks,只不過使用到了fontsize參數。
plt.rcParams['figure.figsize'] = (10,5)
plt.rcParams['figure.dpi'] = 200
y = [1,2,3,4]
scale_ls = range(4)
index_ls = ["富強","民主","文明","和諧"]
plt.xticks(scale_ls,index_ls,fontsize=20)
plt.yticks([1,2,3,3.5,4],fontsize=20)
plt.plot(y)
Snipaste_2018-10-10_13-46-03.png
5.給x軸和y軸加上名字
使用
xlabel(str,fontsize=int )
ylabel(str,fontsize=int )
plt.rcParams['figure.figsize'] = (10,5)
plt.rcParams['figure.dpi'] = 200
y = [1,2,3,4]
scale_ls = range(4)
index_ls = ["富強","民主","文明","和諧"]
plt.xticks(scale_ls,index_ls,fontsize=20)
plt.yticks([1,2,3,3.5,4],fontsize=20)
plt.xlabel("核心價值觀", fontsize=20)
plt.ylabel("順序", fontsize=20)
plt.plot(y)
Snipaste_2018-10-10_13-50-42.png
6.加上網格
plt.grid(True),加上橫縱兩種網格。
plt.grid(True,axis="x"),加上x軸網格。
plt.rcParams['figure.figsize'] = (10,5)
plt.rcParams['figure.dpi'] = 200
y = [1,2,3,4]
scale_ls = range(4)
index_ls = ["富強","民主","文明","和諧"]
plt.xticks(scale_ls,index_ls,fontsize=20)
plt.yticks([1,2,3,3.5,4],fontsize=20)
plt.xlabel("核心價值觀", fontsize=20)
plt.ylabel("順序", fontsize=20)
plt.grid(True,axis="both")
plt.plot(y)
Snipaste_2018-10-10_14-01-54.png
7.加上圖例
使用legend方法,裏面有這麼幾個參數
handles:表明使用的是那幾個曲線的對象
labels:表明對應的圖例文字
loc:放置的位置
prop:額外參數,例如size,控制圖例大小
t = np.arange(0, 2.5, 0.01)
y1 = map(math.sin, math.pi*t)
y2 = map(math.cos, math.pi*t)
l1, = plt.plot(list(y1))
l2, = plt.plot(list(y2))
plt.legend(handles = [l1, l2], labels = ['Sin', 'Cos'], loc = 'best', prop={'size': 20})
Snipaste_2018-10-10_14-13-29.png
8.給線狀圖標點
只用在plot加入參數marker 便可
t = np.arange(0, 2.5, 0.1)
y1 = map(math.sin, math.pi*t)
y2 = map(math.cos, math.pi*t)
l1, = plt.plot(list(y1), marker = "o")
l2, = plt.plot(list(y2), marker = "*")
plt.legend(handles = [l1, l2], labels = ['Sin', 'Cos'], loc = 'best', prop={'size': 20})
Snipaste_2018-10-10_14-19-11.png
9.保存圖片到本地
只用在最後使用savefig 方法
plt.savefig('test.png',dpi=400)
10.畫子圖
這裏使用到了subplot方法
他有三個參數,分別爲
幾行
幾列
第幾個
舉個栗子
subplot(2,2,1) 2行2列(即子圖排列爲田字格形狀)第一個
subplot(2,1,2) 2行1列(即子圖排列爲縱向兩個圖形狀)第二個
t = np.arange(0, 2.5, 0.1)
y1 = map(math.sin, math.pi*t)
y2 = map(math.cos, math.pi*t)
plt.subplot(2, 1, 1)
plt.title("Sin", fontsize=20)
l1, = plt.plot(list(y1), marker = "o")
plt.subplot(2, 1, 2)
plt.title("Cos", fontsize=20)
l2, = plt.plot(list(y2), marker = "*")
這裏我還使用到了title方法,給對應圖表加上了標題。
Snipaste_2018-10-10_14-27-58.png