數據分析 ——— matplotlib基礎(二)

  • 2019 年 10 月 7 日
  • 筆記

有了上一節的基礎的積累,接下來就可以來用matplotlib來畫圖了

一、基本繪圖2D

1.1 線

利用plot()函數畫出一系列點,並用線連接起來:

import matplotlib.pyplot as plt  import numpy as np  import pandas as pd    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 6))  ax1, ax2, ax3, ax4 = axes.flatten()    x = np.linspace(0, np.pi)  y_sin = np.sin(x)  y_cos = np.cos(x)    ax1.plot(x, y_sin)  ax1.set_title("line")      ax2.plot(x, y_sin, 'go--', linewidth=2, markersize=12)  ax2.set_title("--")    ax4.plot(x, y_cos, color='red', marker='+', linestyle='dashed')  ax4.set_title("++")  fig.tight_layout()

運行結果:

在上面的三個面板中分別畫出了sin,cos圖,前面兩個參數分別為x軸, y軸數據。ax2的第三個參數「go–」是matlab風格的繪圖,ax3上給出了點的標記maker,這一塊是可以自己定義的,可以參考我上一篇文章數據分析 ——數據可視化matplotlib(一)

在同一個圖中畫兩條或多條線:

import matplotlib.pyplot as plt  import numpy as np  import pandas as pd    fig, ax1 = plt.subplots(figsize=(10, 6))    x = np.linspace(0, np.pi)  y_sin = np.sin(x)  y_cos = np.cos(x)    ax1.plot(x, y_sin)  ax1.plot(x, y_cos, marker='o', color='green')  ax1.set_title("line")

用plt畫圖:

運行結果都是一樣的

import matplotlib.pyplot as plt  import numpy as np  import pandas as pd    fig = plt.subplots(figsize=(10, 6))    x = np.linspace(0, np.pi)  y_sin = np.sin(x)  y_cos = np.cos(x)    plt.plot(x, y_sin)  plt.plot(x, y_cos, marker='o', color='green')  plt.title("line")  plt.show()

運行結果:

2.2 散點圖

只畫點,但是不用點連接:

import matplotlib.pyplot as plt  import numpy as np  import pandas as pd    fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 6))  ax1, ax2= axes.flatten()    x = np.arange(10)  y =  np.random.randn(10)  z =  np.random.randn(10)      ax1.scatter(x, y, marker=">")  ax1.scatter(x, z, marker="*", color="red")  ax1.set_title("scatter 1")    ax2.scatter(x, y, marker=".", color='purple')  ax2.set_title("scatter 2")    fig.tight_layout()

運行結果:

2.3條形圖

條形圖分兩種,一種是水平的,一種是垂直

import numpy as np  import pandas as pd  import matplotlib.pyplot as plt    np.random.seed(1)  x = np.arange(5)  y = np.random.randn(5)    fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2))    vert_bars = axes[0].bar(x, y, color='black', align='center')  horiz_bars = axes[1].barh(x, y, color='purple', align='center')  #在水平或者垂直方向上畫線  axes[0].axhline(0, color='gray', linewidth=2)  axes[1].axvline(0, color='gray', linewidth=2)  plt.show()

條形圖返回了一個Artists 數組,對應著每個條形。條形圖在現實中用的較少。

2.4 直方圖

直方圖用於統計數據出現的次數或者頻率

import matplotlib.pyplot as plt  import numpy as np  import pandas as pd  fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 6))  ax1, ax2, ax3, ax4= axes.flatten()  np.random.seed(19680801)  n_bins = 10  x = np.random.randn(1000, 3)  colors = ['blue', 'green', 'purple']    ax1.hist(x, n_bins, density=True, histtype='barstacked')  ax1.set_title('stacked bar')    ax2.hist(x,  histtype='barstacked', rwidth=0.9)    ax3.hist(x[:, 0], rwidth=0.9)  ax3.set_title('different sample sizes')    ax4.hist(x, n_bins, density=True, histtype='bar', color=colors, label=colors)  ax4.legend(prop={'size': 10})  ax4.set_title('bars with legend')    fig.tight_layout()  plt.show()

參數中density控制Y軸是概率還是數量,與返回的第一個的變數對應。histtype控制著直方圖的樣式,默認是 『bar』; 對於多個條形時就相鄰的方式呈現如子圖4;『barstacked』 就是疊在一起,如子圖1、2。rwidth 控制著寬度,這樣可以空出一些間隙,比較圖1, 2, 3是只有一條數據時。

2.5 餅圖

# 餅圖  import matplotlib.pyplot as plt  import numpy as np  import pandas as pd    fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(13, 4))    labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'    sizes = [15, 30, 45, 10] # 所佔百分比  explode = (0, 0.1, 0, 0)  # 每個扇形之間的間隔    ax1.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=True)  ax1.axis('equal')    ax2.pie(sizes, autopct='%1.2f%%', shadow=True, startangle=90, explode=explode,      pctdistance=1.12)  ax2.axis('equal')  ax2.legend(labels=labels, loc='upper right')    plt.show()

餅圖自動根據數據的百分比畫餅.。labels是各個塊的標籤,如左圖。autopct=%1.1f%%表示格式化百分比精確輸出, 也就是扇形圖所佔的百分比,explode,突出某些塊,不同的值突出的效果不一樣。pctdistance=1.12百分比距離圓心的距離,默認是0.6.

2.6 等高線圖(輪廓圖)

#等高線圖  import matplotlib.pyplot as plt  import numpy as np  import pandas as pd    fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(13, 4))  x = np.arange(-5, 5, 0.1)  y = np.arange(-5, 5, 0.1)  xx, yy = np.meshgrid(x, y, sparse=True)  z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)  ax1.contourf(x, y, z)  ax2.contour(x, y, z)

上面畫了兩個一樣的輪廓圖,contourf會填充輪廓線之間的顏色。數據x, y, z通常是具有相同 shape 的二維矩陣。x, y 可以為一維向量,但是必需有 z.shape = (y.n, x.n) ,這裡 y.n 和 x.n 分別表示x、y的長度。Z通常表示的是距離X-Y平面的距離,傳入X、Y則是控制了繪製等高線的範圍。

Exit mobile version