Matplotlib簡單教程

Matplotlib簡單教程

繪圖簡介

使用matplotlib庫繪圖,原理很簡單,就是下面這5步:

  • 創(chuàng)建一個圖紙 (figure)
  • 在圖紙上創(chuàng)建一個或多個繪圖(plotting)區(qū)域(也叫子圖,坐標系/軸,axes)
  • 在plotting區(qū)域上描繪點、線等各種marker
  • 為plotting添加修飾標簽(繪圖線上的或坐標軸上的)
  • 其他各種DIY

上述的過程主要分為3個方面:

  • 變量
  • 函數(shù)
  • 圖紙(figure)和子圖(axes)
  • 其中,變量和函數(shù)通過改變figure和axes中的元素(例如:title,label,點和線等等)一起描述figure和axes,也就是在畫布上繪圖。結構如下:
e421081632ff032d4abae155b6c60e3.png

plot繪制繪制坐標

plt.plot(x, y, format_string, **kwargs)

說明:

  • x, y:分別是x,y軸的數(shù)據(jù),可以是列表,參數(shù)x是可選的,而y是必要的
  • fromat_string:控制曲線格式的字符串,可選
  • **kwargs:第二組或更多的(x, y, format_string)

首先繪制一張簡單的圖

import matplotlib.pyplot as plt

plt.plot([1,2,3,4])
plt.xlabel('some x numbers')
plt.ylabel('some y numbers')
plt.title('a straight line')
plt.show()

繪圖的結果如下圖所示:

cd70c40e004ab1e576ae1cebe2fb4e0.png

解釋

可見,繪制一個簡單的圖,只需要原理中的第3,4步就行了。

主要看第3行的代碼,plt.plot()函數(shù)可以接受很多參數(shù),第一、二個是x, y軸的坐標,之后還會有繪圖線的顏色和類型。函數(shù)中我們只給出了一個列表,所以matplotlib默認給出的是y,然后自動生成x。

下面我們傳入多個列表,并且添加描繪線的類型和顏色的部分

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(10)
plt.plot(a, a*1.5, 'go-', label='Firstline')
plt.plot(a, a*2.5, 'rx', label="Secondline")
plt.plot(a, a*3.5, '*', label="Thirdline")
plt.plot(a, a*4.5, 'b-.', label="Fourthline")
plt.title('using_format_string')
plt.xlabel('some x numbers')
plt.ylabel('some y numbers')
plt.legend()
plt.show()

結果如下:


1521697329(1).png

上面的程序中,我們在每一組數(shù)據(jù)的后面加上了控制曲線格式字符串,由顏色、字符風格和標記字符組成。

支持的color

character color character color
'b' blue 'm' magenta
'g' green 'y' yellow
'r' red 'k' black
'c' cyan 'w' white
'#xxxxxx' RGB '0.8' gray level

支持的line style:

標記字符 說明 標記字符 說明
'.' 'D' 菱形
',' 像素(極小點) 'd' 瘦菱形
'o' 實心圈 '|' 豎直線
'v' 倒三角 '1' 下花三角
'^' 上三角 '2' 上花三角
'>' 右三角 '3' 左花三角
'<' 左三角 '4' 右花三角
'h' 豎六邊形 's' 實心方形
'H' 橫六邊形 'p' 實心五角
'+' 十字 '*' 星型
'x' x標記
風格字符 說明
'-' 實線
'--' 波折線
'-.' 點折線
':' 虛線
‘’ 無線條

上述程序中我們?yōu)槊恳粭l線指定了一個label,并且用plt.legend()指定生成圖例。

另外,我們不僅可以用字符串一次性指定多個屬性,也可以分別為每個屬性賦值。

  • color:控制顏色,color=’green’
  • linestyle:線條風格,linestyle=’dashed’
  • marker:標記風格,marker = ‘o’
  • markerfacecolor:標記顏色,markerfacecolor = ‘blue’
  • markersize:標記尺寸,markersize = ‘20’
  • linewidth:線寬:linewidth=2.0

例如:

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(10)
plt.plot(a, a**2, color='green', linestyle='dashed', marker='o', markerfacecolor='blue', markersize='10',linewith=2.0)
plt.title('using_format_string')
plt.xlabel('some x numbers')
plt.ylabel('some y numbers')
plt.legend()
plt.show()

結果如下:


b6bf4f0e41c5cf79bc5c522f4465f0e.png

多圖多axes

MATLAB和plt1都有當前figure和axes的概念
也就是說,通過plt 進行的操作都是對當前圖或子圖進行的,所有的繪圖命令都是針對當前figure和axes的.如果figure()和subplot()沒有定義的話,都默認為figure(1)和subplot(111)。

plt.figure(i):表示當前對第幾塊畫布進行操作

plt.subplot(nrows, ncols, plot_number):把一個繪圖區(qū)域(可以理解成畫布)分成多個小區(qū)域,用來繪制多個子圖。

nrows和ncols表示將畫布分成(nrows*ncols)個小區(qū)域,每個小區(qū)域可以單獨繪制圖形;plot_number表示將圖繪制在第plot_number個子區(qū)域。

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(10)
plt.figure(1)
plt.subplot(221)
plt.plot(a, a, 'ro-')
plt.subplot(222)
plt.plot(a, a**2, 'go-')
plt.subplot(223)
plt.plot(a, a**3, 'bo-')
plt.subplot(224)
plt.plot(a, a**2, 'yo-')
plt.legend()
plt.show()

運行結果:


d3728dfc7bbdee61b2c2a9c4cbd1db8.png

條形圖和直方圖

有了plt.plot()的基礎之后,對后面的直方圖和餅狀圖的理解就很容易了。

直接上例子:

import matplotlib.pyplot as plt

plt.bar([1, 3, 5, 7, 9], [5, 2, 7, 8, 2], label="Example one")
plt.bar([2, 4, 6, 8, 10], [8, 6, 2, 5, 6], label="Example two", color='g')
plt.legend()
plt.xlabel('bar number')
plt.ylabel('bar height')

plt.title('Epic Graph\nAnother Line!')

plt.show()

運行結果如下:


bb26bcae769a810117a791fd147af9e.png

plt..bar()中參數(shù)的總結,轉:http://blog.csdn.net/claroja/article/details/72912791?utm_source=itdadao&utm_medium=referral

接下來我們嘗試添加一些屬性信息:

from matplotlib import pyplot as plt
import numpy as np

# 第一步,取出一張白紙
fig = plt.figure(1)
# 第二步,確定繪圖范圍,由于只需要畫一張圖,所以我們將整張白紙作為繪圖的范圍
ax1 = plt.subplot(111)
# 第三步,整理我們準備繪制的數(shù)據(jù)
data = np.array([15, 20, 18, 25])
# 第四步,準備繪制條形圖,思考繪制條形圖需要確定那些要素
# 1、繪制的條形寬度
# 2、繪制的條形位置(中心)
# 3、條形圖的高度(數(shù)據(jù)值)
width = 0.5
x_bar = np.arange(4)
# 第五步,繪制條形圖的主體,條形圖實質上就是一系列的矩形元素,我們通過plt.bar函數(shù)來繪制條形圖
rect = ax1.bar(left=x_bar, height=data, width=width, color="lightblue", alpha=0.8, align='center')
# 第六步,向各條形上添加數(shù)據(jù)標簽
for rec in rect:
    x = rec.get_x()
    height = rec.get_height()
    ax1.text(x+0.1,1.02*height,str(height))
# 第七步,繪制x,y坐標軸刻度及標簽,標題
xtickLabels = ('first', 'second', 'third', 'fourth')
ax1.set_xticks(x_bar)
ax1.set_xticklabels(("first", "second", "third", "fourth"), fontsize='large', rotation=30, alpha=0.8)
ax1.set_ylabel("sales")
ax1.set_title("The Sales in 2016")
ax1.grid(True)
ax1.set_ylim(0, 28)
plt.show()

運行結果如下:


c54cfa53a29588414b1ce26b560e63d.png

接下來講解直方圖:

接下來,我們會講解直方圖。 直方圖非常像條形圖,傾向于通過將區(qū)段組合在一起來顯示分布。 可能是年齡的分組,或測試的分數(shù)。 我們并不是顯示每一組的數(shù)據(jù),而是按照 20 ~ 25,25 ~ 30… 等等來顯示數(shù)據(jù)。 這里有一個例子:

population_ages = [22, 55, 62, 45, 21, 22, 34, 42, 42, 4, 99, 102, 110, 120, 121, 122, 130, 111, 115, 112, 80, 75, 65,
                   54, 44, 43, 42, 48]
bins = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130]
plt.hist(population_ages, bins, histtype='bar', rwidth=0.8)
plt.xlabel('x', fontsize='large')
plt.ylabel('y', rotation=0, fontsize='large')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()

運行結果如下:


acaf1770a7215d9b5f616653b08ef64.png

散點圖

示例代碼:

import matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
plt.scatter(x,y, label='skitscat', color='k', s=25, marker="o")
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()

運行結果如下:


4f022683d784490b4e569695a9cff1d.png

餅狀圖

通常,餅圖用于顯示部分對于整體的情況,通常以%為單位。 幸運的是,Matplotlib 會處理切片大小以及一切事情,我們只需要提供數(shù)值。

示例程序:

import matplotlib.pyplot as plt

slices = [7,2,2,13]
activities = ['sleeping','eating','working','playing']
cols = ['c','m','r','b']
plt.pie(slices,
        labels=activities,
        colors=cols,
        startangle=90,
        shadow= True,
        explode=(0,0.1,0,0),
        autopct='%1.1f%%')
plt.title('Interesting Graph\nCheck it out')
plt.show()

運行結果:


image-20190123154113196.png

plt.pie中,我們需要指定『切片』,這是每個部分的相對大小。 然后,我們指定相應切片的顏色列表。 接下來,我們可以選擇指定圖形的『起始角度』。 這使你可以在任何地方開始繪圖。 在我們的例子中,我們?yōu)轱瀳D選擇了 90 度角,這意味著第一個部分是一個豎直線條。 接下來,我們可以選擇給繪圖添加一個字符大小的陰影,然后我們甚至可以使用explode拉出一個切片。

我們總共有四個切片,所以對于explode,如果我們不想拉出任何切片,我們傳入0,0,0,0。 如果我們想要拉出第一個切片,我們傳入0.1,0,0,0。

最后,我們使用autopct,選擇將百分比放置到圖表上面。

堆疊圖

堆疊圖用于顯示『部分對整體』隨時間的關系。 堆疊圖基本上類似于餅圖,只是隨時間而變化。

讓我們考慮一個情況,我們一天有 24 小時,我們想看看我們如何花費時間。 我們將我們的活動分為:睡覺,吃飯,工作和玩耍。

我們假設我們要在 5 天的時間內跟蹤它,因此我們的初始數(shù)據(jù)將如下所示:

import matplotlib.pyplot as plt

days = [1, 2, 3, 4, 5]

sleeping = [7, 8, 6, 11, 7]
eating =  [2, 3, 4, 3, 2]
working = [7, 8, 7, 2, 2]
playing = [8, 5, 7, 8, 13]

因此,我們的x軸將包括day變量,即 1, 2, 3, 4 和 5。然后,日期的各個成分保存在它們各自的活動中。 像這樣繪制它們:

plt.stackplot(days, sleeping, eating, working, playing, colors=['m', 'c', 'r', 'k'])

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.show()

運行結果如下:


79a83b1380fb825a4d2039dc3004fab.png

在這里,我們可以至少在顏色上看到,我們如何花費我們的時間。 問題是,如果不回頭看代碼,我們不知道什么顏色是什么。 下一個問題是,對于多邊形來說,我們實際上不能為數(shù)據(jù)添加『標簽』。 因此,在任何不止是線條,帶有像這樣的填充或堆疊圖的地方,我們不能以固有方式標記出特定的部分。 這不應該阻止程序員。 我們可以解決這個問題:

import matplotlib.pyplot as plt

days = [1, 2, 3, 4, 5]

sleeping = [7, 8, 6, 11, 7]
eating = [2, 3, 4, 3, 2]
working = [7, 8, 7, 2, 2]
playing = [8, 5, 7, 8, 13]


plt.plot([], [], color='m', label='Sleeping', linewidth=5)
plt.plot([], [], color='c', label='Eating', linewidth=5)
plt.plot([], [], color='r', label='Working', linewidth=5)
plt.plot([], [], color='k', label='Playing', linewidth=5)

plt.stackplot(days, sleeping, eating, working, playing, colors=['m', 'c', 'r', 'k'])

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()

運行結果如下:


a6d73bd871f8157639d2e87cae164c5.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 這篇筆記主要來自《利用python進行數(shù)據(jù)分析》的第八章第一節(jié),對matplotlib的基本使用介紹的特別清晰。關...
    ydlstartx閱讀 1,075評論 0 2
  • 前言 有時候為了直觀,我們需要將數(shù)據(jù)可視化,Python編程中最為常用的一個庫是matplotlib。那么什么是m...
    開發(fā)者也閱讀 5,504評論 2 46
  • matplotlib基礎 matplotlib是面向對象的繪圖工具包,繪制的圖形中的每一個元素都是一個對象,可以修...
    Alex_楊策閱讀 2,749評論 0 1
  • 在數(shù)據(jù)分析中,數(shù)據(jù)可視化非常重要。我們可以將數(shù)據(jù)繪制成各種圖形,比如直方圖,散點圖等,從圖形中可以明顯看出各種數(shù)據(jù)...
    Clemente閱讀 2,026評論 0 4
  • 2018.3.2 祝大家元宵節(jié)快樂~
    謙謙闋歌閱讀 92評論 0 0

友情鏈接更多精彩內容