Python繪製六種視覺化圖表詳解(建議收藏)

Python程式設計時光發表於2018-08-24

公眾號:Python程式設計時光

視覺化圖表,有相當多種,但常見的也就下面幾種,其他比較複雜一點,大都也是基於如下幾種進行組合,變換出來的。對於初學者來說,很容易被這官網上眾多的圖表型別給嚇著了,由於種類太多,幾種圖表的繪製方法很有可能會混淆起來。

因此,在這裡,我特地總結了六種常見的基本圖表型別,你可以通過對比學習,打下堅實的基礎。

01. 折線圖

繪製折線圖,如果你資料不是很多的話,畫出來的圖將是曲折狀態,但一旦你的資料集大起來,比如下面我們的示例,有100個點,所以我們用肉眼看到的將是一條平滑的曲線。

這裡我繪製三條線,只要執行三次plt.plot就可以了。

import numpy as np
import matplotlib.pyplot as plt

x= np.linspace(0, 2, 100)

plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')

plt.xlabel('x label')
plt.ylabel('y label')

plt.title("Simple Plot")

plt.legend()

plt.show()
複製程式碼

show image

折線圖

02. 散點圖

其實散點圖和折線圖是一樣的原理,將散點圖裡的點用線連線起來就是折線圖了。所以繪製散點圖,只要設定一下線型即可。

注意:這裡我也繪製三條線,和上面不同的是,我只用一個plt.plot就可以了。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0., 5., 0.2)

# 紅色破折號, 藍色方塊 ,綠色三角塊
plt.plot(x, x, 'r--', x, x**2, 'bs', x, x**3, 'g^')
plt.show()
複製程式碼

show image

散點圖

03. 直方圖

直方圖,大家也不算陌生了。這裡小明加大難度,在一張圖裡,畫出兩個頻度直方圖。這應該在實際場景上也會遇到吧,因為這樣真的很方便比較,有木有?

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)

mu1, sigma1 = 100, 15
mu2, sigma2 = 80, 15
x1 = mu1 + sigma1 * np.random.randn(10000)
x2 = mu2 + sigma2 * np.random.randn(10000)

# the histogram of the data
# 50:將資料分成50組
# facecolor:顏色;alpha:透明度
# density:是密度而不是具體數值
n1, bins1, patches1 = plt.hist(x1, 50, density=True, facecolor='g', alpha=1)
n2, bins2, patches2 = plt.hist(x2, 50, density=True, facecolor='r', alpha=0.2)

# n:概率值;bins:具體數值;patches:直方圖物件。

plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')

plt.text(110, .025, r'$\mu=100,\ \sigma=15$')
plt.text(50, .025, r'$\mu=80,\ \sigma=15$')

# 設定x,y軸的具體範圍
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
複製程式碼

show image

直方圖

04. 柱狀圖

同樣的,簡單的柱狀圖,我就不畫了,這裡畫三種比較難的圖。

4.1 並列柱狀圖

import numpy as np
import matplotlib.pyplot as plt
size = 5
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)
x = np.arange(size)

# 有多少個型別,只需更改n即可
total_width, n = 0.8, 3     
width = total_width / n

# 重新擬定x的座標
x = x - (total_width - width) / 2

# 這裡使用的是偏移
plt.bar(x, a,  width=width, label='a')
plt.bar(x + width, b, width=width, label='b')
plt.bar(x + 2 * width, c, width=width, label='c')
plt.legend()
plt.show()
複製程式碼

show image

並列柱狀圖

4.2 疊加柱狀圖

import numpy as np
import matplotlib.pyplot as plt

size = 5
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)

x = np.arange(size)

# 這裡使用的是偏移
plt.bar(x, a, width=0.5, label='a',fc='r')
plt.bar(x, b, bottom=a, width=0.5, label='b', fc='g')
plt.bar(x, c, bottom=a+b, width=0.5, label='c', fc='b')

plt.ylim(0, 2.5)
plt.legend()
plt.grid(True)
plt.show()
複製程式碼

show image

疊加柱狀圖

05. 餅圖

5.1 普通餅圖

import matplotlib.pyplot as plt

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]

# 設定分離的距離,0表示不分離
explode = (0, 0.1, 0, 0) 

plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
        shadow=True, startangle=90)

# Equal aspect ratio 保證畫出的圖是正圓形
plt.axis('equal') 

plt.show()
複製程式碼

show image

餅圖

5.2 巢狀餅圖

import numpy as np
import matplotlib.pyplot as plt

# 設定每環的寬度
size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])

# 通過get_cmap隨機獲取顏色
cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))

print(vals.sum(axis=1))
# [92. 77. 39.]

plt.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'))
print(vals.flatten())
# [60. 32. 37. 40. 29. 10.]

plt.pie(vals.flatten(), radius=1-size, colors=inner_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

# equal 使得為正圓
plt.axis('equal') 
plt.show()
複製程式碼

show image

巢狀餅圖

5.3 極軸餅圖

要說酷炫,極軸餅圖也是數一數二的了,這裡肯定也要學一下。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)

N = 10
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)

ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=0.0)
# left表示從哪開始,
# radii表示從中心點向邊緣繪製的長度(半徑)
# width表示末端的弧長

# 自定義顏色和不透明度
for r, bar in zip(radii, bars):
    bar.set_facecolor(plt.cm.viridis(r / 10.))
    bar.set_alpha(0.5)

plt.show()
複製程式碼

show image

極軸餅圖

06. 三維圖

6.1 繪製三維散點圖

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

data = np.random.randint(0, 255, size=[40, 40, 40])

x, y, z = data[0], data[1], data[2]
ax = plt.subplot(111, projection='3d')  # 建立一個三維的繪圖工程
#  將資料點分成三部分畫,在顏色上有區分度
ax.scatter(x[:10], y[:10], z[:10], c='y')  # 繪製資料點
ax.scatter(x[10:20], y[10:20], z[10:20], c='r')
ax.scatter(x[30:40], y[30:40], z[30:40], c='g')

ax.set_zlabel('Z')  # 座標軸
ax.set_ylabel('Y')
ax.set_xlabel('X')
plt.show()
複製程式碼

show image

三維散點圖

6.2 繪製三維平面圖

from matplotlib import pyplot as plt
import numpy as np
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)

# 具體函式方法可用 help(function) 檢視,如:help(ax.plot_surface)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')

plt.show()
複製程式碼

show image

繪製三維平面圖


Python繪製六種視覺化圖表詳解(建議收藏)

相關文章