Python數據可視化----繪製二維圖像(折線圖、餅圖、柱狀圖、散點圖、等高線,3D圖等)

(1)繪製一條折線圖

import matplotlib.pyplot as plt   #調用matplotlib中的子模塊pyplot繪製折線圖

# 定義2個列表分別作爲X軸、Y軸數據
x_data = ['2012','2013', '2014', '2015', '2016', '2017', '2018', '2019']
y_data = [45000,58000, 60200, 63000, 71000, 84000, 90500, 107000]

# 第一個列表代表橫座標的值,第二個代表縱座標的值
plt.plot(x_data, y_data)

# 調用show()函數顯示圖形
plt.show()

運行結果爲:

其實可以看到python中的繪圖和matlab中的繪圖一模一樣,當然,也可以類似的修改線型、色彩、線寬等屬性。

(2)修改繪圖屬性

import matplotlib.pyplot as plt

#定義兩組數據的x,y座標
x_axis=['2010','2011','2012','2013','2014','2015','2016','2017','2018','2019']
y1_axis=[12900,13500,14700,15223,25790,26489,27678,28900,29213,31290]
y2_axis=[16900,17500,18700,25223,27790,29489,30678,33900,34213,35290]

# 指定兩條折線的顏色、線寬和樣式
plt.plot(x_axis, y1_axis, color = 'green', linewidth = 2.0, linestyle = '--')
plt.plot(x_axis, y2_axis, color = 'blue', linewidth = 3.0, linestyle = '-.')

#調用show()函數顯示圖形
plt.show()

 

(3)添加繪圖標註

import matplotlib.pyplot as plt

#定義x座標值
x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017','2018','2019']

# 定義2個列表分別作爲兩條折線的Y軸數據
y_data = [57000, 61200, 62000, 699000, 83500, 91500, 107000,11900,12800]
y_data2 = [51000, 53200, 56500,59300, 60800, 65500, 69700,73000,82050]

# 指定折線的顏色、線寬和樣式,ln1和ln2是plot函數的返回值,相當於matlab中的句柄
ln1,= plt.plot(x_data, y_data, color = 'red', linewidth = 2.0, linestyle = '--')
ln2,= plt.plot(x_data, y_data2, color = 'blue', linewidth = 3.0, linestyle = '-.')

# 調用legend函數設置圖例
plt.legend(handles=[ln1, ln2], labels=['June Sale Amount', 'July Sale Amount'],loc='best')

# 調用show()函數顯示圖形
plt.show()

運行結果如下:

上述例2中需要注意的是有以下幾點:

1、plot的返回值有多個,其中第一個返回值代表該圖形,因此使用ln1,(一定要有逗號)返回第一個返回值;

2.legend函數的第一個參數即是函數plot的第一個返回值(如果第一個參數沒有指明,則按照順序爲折線圖中的多條折線添加圖例);第二個參數爲圖例的內容,第三個參數是圖例所放置的位置,一般具有如下表中的位置參數:

位置參數及意義
'best':自動選擇最佳位置

'upper right':將圖例放在右上角。

'upper left':將圖例放在左上角
'lower left':將圖例放在左下角
'lower right':將圖例放在右下角
'right':將圖例放在右邊
'center left':將圖例放在左邊居中的位置
'center right':將圖例放在右邊居中的位置
'lower center':將圖例放在底部居中的位置
'upper center':將圖例放在頂部居中的位置
'center':將圖例放在中心

3.Matplotlib 也允許在調用 plot() 函數時爲每條折線分別傳入 label 參數,這樣程序在調用 legend() 函數時就無須傳入 labels、handles 參數了:

import matplotlib.pyplot as plt

#定義兩組數據的x,y座標
x_axis=['2010','2011','2012','2013','2014','2015','2016','2017','2018','2019']
y1_axis=[12900,13500,14700,15223,25790,26489,27678,28900,29213,31290]
y2_axis=[16900,17500,18700,25223,27790,29489,30678,33900,34213,35290]

# 指定兩條折線的顏色、線寬和樣式
#ln1,和ln2均爲函數句柄,函數句柄是函數的返回值,可用來調用函數對圖形進行操作
plt.plot(x_axis, y1_axis, color = 'green', linewidth = 2.0, linestyle = '--',label='C++')
plt.plot(x_axis, y2_axis, color = 'blue', linewidth = 3.0, linestyle = '-.',label='Python')

#調用show()函數顯示圖形
plt.show()

4.如果圖例內容是中文字體,那麼上述代碼將不會顯示圖例,需要添加下述代碼塊:

import matplotlib.font_manager as fm
# 使用Matplotlib的字體管理器加載中文字體
my_font=fm.FontProperties(fname="C:\Windows\Fonts\simkai.ttf")
# 調用legend函數設置圖例
plt.legend(handles=[ln2, ln1], labels=['六月銷售額', '七月銷售額'],
    loc='lower right', prop=my_font)

5.Python默認的圖例字體是英文字體,那麼我們也可以通過以下方式改變python圖例的默認字體:

在 python交互式解釋器中輸入如下兩行命令:

import matplotlib
matplotlib.matplotlib_fname()
'D:\\Python\\Python36\\lib\\site-packages\\matplotlib\\mp1-data\\matplotlibrc'

其中 matplotlib_fname() 函數會顯示 Matplotlib 配置文件的保存位置,此處顯示該文件的存儲路徑爲 D:\Python\Python36\lib\site-packages\matplotlib\mpl-data\matplotlibrc。打開該文件,找到如下這行代碼:

#font.family:sans-serif

上面這行代碼用於配置 Matplotlib 的默認字體,取消運行配置代碼之前的註釋符號(#),並將後面的 sans-serif 修改爲本地己有的中文字體。例如使用微軟雅黑字體,只要將上面的配置代碼修改爲如下形式即可:

font.family: Microsoft YaHei

通過上面設置,即可改變 Matplotlib 的默認字體,這樣即可避免每次調用 legend() 函數時都需要額外指定字體。

(4)座標軸設置

python可以調用 xlable() 和 ylabel() 函數分別設置 X 軸、Y 軸的名稱,也可以通過 title() 函數設置整個數據圖的標題,還可以調用 xticks()、yticks() 函數分別改變 X 軸、Y 軸的刻度值(允許使用文本作爲刻度值)。如下例:

例3:

import matplotlib.pyplot as plt

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017','2018','2019']

# 定義2個列表分別作爲兩條折線的Y軸數據
y_data = [56000, 62200, 64000, 73000, 85600, 92500, 120000,135000,146000]
y_data2 = [51000, 53200, 54500,56300, 57500, 59800, 64700,68900,72900]

import matplotlib.font_manager as fm
# 使用Matplotlib的字體管理器加載中文字體
my_font=fm.FontProperties(fname="C:\Windows\Fonts\simkai.ttf")

# 指定折線的顏色、線寬和樣式
plt.plot(x_data, y_data, color = 'red', linewidth = 2.0,
    linestyle = '--', label='Juna')
plt.plot(x_data, y_data2, color = 'blue', linewidth = 3.0,
    linestyle = '-.', label='July')

# 調用legend函數設置圖例
plt.legend(loc='best')

# 設置數據圖的標題
plt.title('Sale Amount in Juna or July')

# 設置兩條座標軸的標籤
plt.xlabel("Year")
plt.ylabel("Sale")

# 設置Y軸上的刻度值:第一個參數是點的位置,第二個參數是點的文字提示
plt.yticks([60000, 85000, 120000],[r'Good', r'Wonderful', r'Hot'])

# 調用show()函數顯示圖形
plt.show()

運行結果爲:

如果需要進一步設置圖形,可以添加以下代碼:

ax = plt.gca()
# 設置將X軸的刻度值放在底部X軸上
ax.xaxis.set_ticks_position('bottom')
# 設置將Y軸的刻度值放在底部X軸上
ax.yaxis.set_ticks_position('left')

# 設置右邊座標軸線的顏色(設置爲none表示不顯示)
ax.spines['right'].set_color('none')
# 設置頂部座標軸線的顏色(設置爲none表示不顯示)
ax.spines['top'].set_color('none')

# 定義底部座標軸線的位置(放在85000數值處)
ax.spines['bottom'].set_position(('data', 70000))

運行結果爲:

(5)一張圖上呈現多個子圖subplot

和matlab一樣,python調用 subplot() 函數可以創建一個子圖,然後程序就可以在子圖上進行繪製。

subplot(nrows, ncols, index, **kwargs) 函數的 nrows 參數指定將數據圖區域分成多少行;ncols 參數指定將數據圖區域分成多少列;index 參數指定獲取第幾個區域。
subplot() 函數也支持直接傳入一個三位數的參數,其中第一位數將作爲 nrows 參數;第二位數將作爲 ncols 參數;第三位數將作爲 index 參數。

例4:

import matplotlib.pyplot as plt
import numpy as np

plt.figure()

# 定義從-2*pi到2*pi之間的數據,平均取128個數據點
x_data = np.linspace(-2*np.pi, 2*np.pi, 128, endpoint=True)  # ①

# 將整個figure分成兩行兩列,第三個參數表示該圖形放在第1個網格
plt.subplot(2, 2, 1)
# 繪製正弦曲線
plt.plot(x_data, np.sin(x_data))
plt.gca().spines['right'].set_color('none')
plt.gca().spines['top'].set_color('none')
plt.gca().spines['bottom'].set_position(('data', 0))
plt.gca().spines['left'].set_position(('data', 0))
plt.title('Curve of Sin()')

# 將整個figure分成兩行兩列,並將該圖形放在第2個網格
plt.subplot(2,2,2)
# 繪製餘弦曲線
plt.plot(x_data, np.cos(x_data))
plt.gca().spines['right'].set_color('none')
plt.gca().spines['top'].set_color('none')
plt.gca().spines['bottom'].set_position(('data', 0))
plt.gca().spines['left'].set_position(('data', 0))
plt.title('Curve of Cos()')

# 將整個figure分成兩行兩列,並該圖形放在第3個網格
plt.subplot(2,2,3)
# 繪製正切曲線
plt.plot(x_data, np.tan(x_data))
plt.gca().spines['right'].set_color('none')
plt.gca().spines['top'].set_color('none')
plt.gca().spines['bottom'].set_position(('data', 0))
plt.gca().spines['left'].set_position(('data', 0))
plt.title('Curve of Tan()')

plt.show()

運行的結果如下圖:

(6)Python繪製餅圖

例:

#註明:此程序來源於Python教程

import matplotlib.pyplot as plt

# 準備數據
data = [0.16881, 0.14966, 0.07471, 0.06992,
    0.04762, 0.03541, 0.02925, 0.02411, 0.02316, 0.01409, 0.36326]

# 準備標籤
labels = ['Java', 'C', 'C++', 'Python',
    'Visual Basic .NET', 'C#', 'PHP', 'JavaScript',
    'SQL', 'Assembly langugage', '其他']

# 將第4個語言(Python)分離出來:突出Pyhon的效果
explode = [0, 0, 0, 0.3, 0, 0, 0, 0, 0, 0, 0]

# 使用自定義顏色
colors=['red', 'pink', 'magenta','purple','orange']

# 將橫、縱座標軸標準化處理,保證餅圖是一個正圓,否則爲橢圓
plt.axes(aspect='equal')
# 控制X軸和Y軸的範圍(用於控制餅圖的圓心,半徑)
plt.xlim(0,8)
plt.ylim(0,8)

# 繪製餅圖
plt.pie(x = data, # 繪圖數據
    labels=labels, # 添加編程語言標籤
    explode=explode, # 突出顯示Python
    colors=colors, # 設置餅圖的自定義填充色
    autopct='%.3f%%', # 設置百分比的格式,此處保留3位小數
    pctdistance=0.8,  # 設置百分比標籤與圓心的距離
    labeldistance = 1.15, # 設置標籤與圓心的距離
    startangle = 180, # 設置餅圖的初始角度
    center = (4, 4), # 設置餅圖的圓心(相當於X軸和Y軸的範圍)
    radius = 3.8, # 設置餅圖的半徑(相當於X軸和Y軸的範圍)
    counterclock = False, # 是否逆時針,這裏設置爲順時針方向
    wedgeprops = {'linewidth': 1, 'edgecolor':'green'},# 設置餅圖內外邊界的屬性值
    textprops = {'fontsize':12, 'color':'black'}, # 設置文本標籤的屬性值
    frame = 1) # 是否顯示餅圖的圓圈,此處設爲顯示

# 不顯示X軸和Y軸的刻度值
plt.xticks(())
plt.yticks(())

# 添加圖標題
plt.title('Ranking of All language')

# 顯示圖形
plt.show()

運行結果爲:

(7)Python繪製柱狀圖

例6:

#Python繪製垂直柱狀圖:
import matplotlib.pyplot as plt
import numpy as np

# 構建數據
x_data = ['2012', '2013', '2014', '2015', '2016', '2017', '2018','2019']
y_data1 = [58000, 60200, 62500, 72000, 83000, 90500, 106000,11500]
y_data2 = [53000, 54500, 51500,58300, 57900, 59500, 62700,70900]

# 繪圖
plt.bar(x=x_data, height=y_data1, label='Book1', color='steelblue', alpha=0.7)
plt.bar(x=x_data, height=y_data2, label='Book2', color='indianred', alpha=0.7)

# 在柱狀圖上顯示具體數值, ha參數控制水平對齊方式, va控制垂直對齊方式
for x, y in enumerate(y_data1):
    plt.text(x, y + 100, '%s' % y, ha='center', va='bottom')
for x, y in enumerate(y_data2):
    plt.text(x, y + 100, '%s' % y, ha='center', va='top')

# 設置標題
plt.title("Book1 and Book2")
# 爲兩條座標軸設置名稱
plt.xlabel("year")
plt.ylabel("sales")
# 顯示圖例
plt.legend()
plt.show()

運行結果如下:

爲了能在柱狀圖上顯示具體的數值,程序可以調用 text() 函數在數據圖上輸出文字。

 text() 函數的前兩個參數控制輸出文字的 X、Y 座標,第三個參數則控制輸出的內容。其中 va 參數控制文字的垂直對齊方式,ha 參數控制文字的水平對齊方式。如上面程序所示,由於 X 軸數據是一個字符串列表,因此 X 軸實際上是以列表元素的索引作爲刻度值的。因此,當程序指定輸出文字的 X 座標爲0 時,表明將該文字輸出到第一個條柱處;對於 Y 座標而言,條柱的數值正好在條柱高度所在處(即2011年沒有,從2012年開始呈現數據座標圖),如果指定 Y 座標爲條柱的數值 +100,就是控制將文字輸出到條柱略上一點的位置。

爲了將多個柱狀圖的條柱並列顯示,程序需要爲這些柱狀圖重新計算不同的 X 軸數據。爲了精確控制條柱的寬度,程序可以在調用 bar() 函數時傳入 width 參數,這樣可以更好地計算條柱的並列方式。將上面程序改爲如下形式:

例7:

#Python繪製垂直並列,且有空隙的柱狀圖:
import matplotlib.pyplot as plt
import numpy as np

# 構建數據
x_data = ['2012', '2013', '2014', '2015', '2016', '2017', '2018','2019']
y_data1 = [58000, 60200, 62500, 72000, 83000, 90500, 106000,115000]
y_data2 = [53000, 54500, 51500,58300, 57900, 59500, 62700,70900]

bar_width=0.35   #柱狀的寬度
gap_width=0.05   #柱狀與柱狀之間的間隙寬度
# 將y_data1中的X軸數據改爲使用range(len(x_data), 即0、1、2...
plt.bar(x=range(len(x_data)), height=y_data1, label='Book1',
    color='steelblue', alpha=0.7, width=bar_width)

# 將y_data2中的X軸數據改爲使用np.arange(len(x_data))+bar_width,
# 即bar_width、1+bar_width、2+bar_width...這樣就和第一個柱狀圖實現了並列
plt.bar(x=np.arange(len(x_data))+bar_width+gap_width, height=y_data2,
    label='Book2', color='indianred', alpha=0.7, width=bar_width)


# 在柱狀圖上顯示具體數值, ha參數控制水平對齊方式, va控制垂直對齊方式
for x, y in enumerate(y_data1):
    plt.text(x, y + 100, '%s' % y, ha='center', va='bottom')
for x, y in enumerate(y_data2):
    plt.text(x+bar_width, y + 100, '%s' % y, ha='center', va='top')

# 設置標題
plt.title("Book1 and Book2")
# 爲兩條座標軸設置名稱
plt.xlabel("year")
plt.ylabel("sales")
plt.xticks(np.arange(len(x_data))+bar_width/2, x_data)

# 顯示圖例
plt.legend()
plt.show()

運算結果爲:

例8:

#Python繪製水平柱狀圖:
import matplotlib.pyplot as plt
import numpy as np

# 構建數據
x_data = ['2012', '2013', '2014', '2015', '2016', '2017', '2018','2019']
y_data1 = [58000, 60200, 62500, 72000, 83000, 90500, 106000,115000]
y_data2 = [53000, 54500, 51500,58300, 57900, 59500, 62700,70900]

bar_width=0.35   #柱狀的寬度
plt.barh(y=range(len(x_data)), width=y_data1, label='Book1',
    color='steelblue', alpha=0.7, height=bar_width)

# Y軸數據使用np.arange(len(x_data))+bar_width,
# 就是bar_width、1+bar_width、2+bar_width...這樣就和第一個柱狀圖並列了
plt.barh(y=np.arange(len(x_data))+bar_width, width=y_data2,
    label='Book2', color='indianred', alpha=0.7, height=bar_width)

# 在柱狀圖上顯示具體數值, ha參數控制水平對齊方式, va控制垂直對齊方式
for y, x in enumerate(y_data1):
    plt.text(x+5000, y-bar_width/2, '%s' % x, ha='center', va='bottom')
for y, x in enumerate(y_data2):
    plt.text(x+5000, y+bar_width/2, '%s' % x, ha='center', va='bottom')

# 爲Y軸設置刻度值
plt.yticks(np.arange(len(x_data))+bar_width/2, x_data)
# 設置標題
plt.title("Book1 and Book2")
# 爲兩條座標軸設置名稱
plt.xlabel("Sales")
plt.ylabel("Year")
# 顯示圖例
plt.legend()
plt.show()

運行結果如下:

(8)Python繪製散點圖

調用 Matplotlib 的 scatter() 函數來繪製散點圖,該函數支持如下常用參數:

  • x:指定 X 軸數據。
  • y:指定 Y 軸數據。
  • s:指定散點的大小。
  • c:指定散點的顏色。
  • alpha:指定散點的透明度。
  • linewidths:指定散點邊框線的寬度。
  • edgecolors:指定散點邊框的顏色。
  • marker:指定散點的圖形樣式。應參數支持'.'(點標記)、','(像素標記)、'o'(圓形標記)、'v'(向下三角形標記)、'^'(向上三角形標記)、'<'(向左三角形標記)、'>'(向右三角形標記)、'1'(向下三叉標記)、'2'(向上三叉標記)、'3'(向左三叉標記)、'4'(向右三叉標記)、's'(正方形標記)、'p'(五地形標記)、'*'(星形標記)、'h'(八邊形標記)、'H'(另一種八邊形標記)、'+'(加號標記)、'x'(x標記)、'D'(菱形標記)、'd'(尖菱形標記)、'|'(豎線標記)、'_'(橫線標記)等值。
  • cmap:指定散點的顏色映射,會使用不同的顏色來區分散點的值。

例9:

#繪製散點圖

import matplotlib.pyplot as plt
import numpy as np

plt.figure()

# 定義從-2*pi到2*pi之間的數據,平均取128個數據點
x_data = np.linspace(-2*np.pi, 2*np.pi, 128, endpoint=True)

# 沿着正弦曲線繪製散點圖
plt.scatter(x_data, np.sin(x_data), c='purple', # 設置點的顏色
    s=50, # 設置點半徑
    alpha = 0.5, # 設置透明度
    marker='p', # 設置使用五邊形標記
    linewidths=1, # 設置邊框的線寬
    edgecolors=['red', 'yellow']) # 設置邊框的顏色

# 繪製第二個散點圖(只包含一個起點),突出起點
plt.scatter(x_data[0], np.sin(x_data)[0], c='red', # 設置點的顏色
    s=150, # 設置點半徑
    alpha =1) # 設置透明度

# 繪製第三個散點圖(只包含一個結束點),突出結束點
plt.scatter(x_data[127], np.sin(x_data)[127], c='black', # 設置點的顏色
    s=150, # 設置點半徑
    alpha =1) # 設置透明度

plt.gca().spines['right'].set_color('none')
plt.gca().spines['top'].set_color('none')
plt.gca().spines['bottom'].set_position(('data', 0))
plt.gca().spines['left'].set_position(('data', 0))
plt.title('Scatter Diagram of Sin()')
plt.show()

運行結果如下:

可以看到,例子中繪製了三條散點圖,其中第一條是繪製的散點圖(多個點),後面的是繪製了單點(即數據始發點和終止點)的散點圖,並對其進行了一定的突出效果。

(9)Python繪製等高線

繪製等高線圖需要三維數據,其中 X、Y 軸數據決定座標點,還需要對應的高度數據(相當於 Z 軸數據)來決定不同座標點的高度。Python可以調用 contour() 函數繪製等高線,調用 contourf() 函數爲等高線圖填充顏色。
在調用 contour()、contourf() 函數時可以指定如下常用參數:

  • x:指定 X 軸數據。
  • y:指定 Y 軸數據。
  • z:指定 X、Y 座標對應點的高度數據。
  • colors:指定不同高度的等高線的顏色。
  • alpha:指定等高線的透明度。
  • cmap:指定等高線的顏色映射,即自動使用不同的顏色來區分不同的高度區域。
  • linewidths:指定等高線的寬度。
  • linestyles:指定等高線的樣式。
#繪製等高線

import matplotlib.pyplot as plt
import numpy as np

#步驟一:首先,收集數據
delta = 0.025
# 生成代表X軸數據的列表
x = np.arange(-4.0, 4.0, delta)
# 生成代表Y軸數據的列表
y = np.arange(-3.0, 3.0, delta)
# 對x、y數據執行網格化
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
# 計算Z軸數據(高度數據)
Z = (Z1 - Z2) * 3

#步驟二:其次,等高線填充顏色
# 爲等高線圖填充顏色, 16指定將等高線分爲幾部分
plt.contourf(x, y, Z, 16, alpha = 0.8,
    cmap='rainbow')  # 使用顏色映射來區分不同高度的區域

#步驟三:最後,繪製等高線並設置座標等
# 繪製等高線
C = plt.contour(x, y, Z, 16,
    colors = 'black', # 指定等高線的顏色
    linewidth = 0.5) # 指定等高線的線寬

# 繪製等高線數據
plt.clabel(C, inline = True, fontsize = 10)
# 去除座標軸
plt.xticks(())
plt.yticks(())
# 設置標題
plt.title("Isoheight")
# 爲兩條座標軸設置名稱
plt.xlabel("Latitude")
plt.ylabel("Longitude")
plt.show()

運算結果爲:

(10)Python繪製3D圖形

在Python中繪製 3D 圖形,需要調用 Axes3D 對象的 plot_surface() 方法

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

fig = plt.figure(figsize=(12, 8))
ax = Axes3D(fig)

delta = 0.135
# 生成代表X軸數據的列表
x = np.arange(-3.0, 3.0, delta)
# 生成代表Y軸數據的列表
y = np.arange(-2.0, 2.0, delta)
# 對x、y數據執行網格化
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
# 計算Z軸數據(高度數據)
Z = (Z1 - Z2) * 2
# 繪製3D圖形
ax.plot_surface(X, Y, Z,
    rstride=1,  # rstride(row)指定行的跨度
    cstride=1,  # cstride(column)指定列的跨度
    cmap=plt.get_cmap('rainbow'))  # 設置顏色映射
# 設置Z軸範圍
ax.set_zlim(-2.5, 2.5)
# 設置標題
plt.title("Figure-3D")
plt.show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章