python-資料分析-Matplotlib-1-基礎圖形(曲線圖-散點-柱狀-堆疊柱狀-餅狀圖-直方圖)

little小新發表於2024-06-12

曲線圖

# -*- coding: utf-8 -*-
#基礎、曲線圖

import numpy
import matplotlib.pyplot as plt

#設定字型 SimHei: 黑體
#需要注意的是,使用中文字型後坐標軸上的負號將會無法顯示,需要將`axes.unicode_minus`引數設定為`False`,這樣才能讓座標軸上的負號正常顯示
plt.rcParams['font.sans-serif'].insert(0, 'SimHei')
plt.rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題

#如果使用的是Jupyter Notebook、透過下面的魔法指令,我們可以在繪圖時生成向量圖(SVG - Scalable Vector Graphics),向量圖的特點是不會因為放大、縮小或旋轉等操作而失真
#%config InlineBackend.figure_format = 'svg'

#建立畫布
#畫布大小、解析度、背景色
#figure()函式可以用來建立畫布 figure函式的返回值是一個Figure物件,它代表了繪圖使用的畫布
##figsize引數指定畫布的尺寸(預設值是[6.4, 4.8])
#dpi引數指定畫布的解析度(預設值是100)
#facecolor引數指定畫布的背景色(預設值是白色)
plt.figure(figsize=(10,10), dpi=120, facecolor='darkgray')

#建立座標系
#subplot()函式來建立座標系,該函式會返回Axes物件
#subplot的前三個引數分別用來指定整個畫布分成 幾行幾列 以及當前 座標系的索引 ,這三個引數的預設值都是1
#也可以透過上面建立的Figure物件的add_subplot方法或add_axes方法來建立座標系,前者跟subplot函式的作用一致,後者會產生巢狀的座標系
plt.subplot(2, 2, 1)    #建立一個2x2的網格,並選擇第1個子圖

#繪製圖表 - 折線圖
x = numpy.linspace(-2 * numpy.pi, 2 * numpy.pi, 120)    #生成120個點
y = numpy.sin(x)    #生成y值
#
# #刻度 可不畫 預設自動
# plt.xticks([0, 2 * numpy.pi, 4 * numpy.pi, 6 * numpy.pi, 8 * numpy.pi, 10 * numpy.pi, 12 * numpy.pi])

#建立畫布
plt.figure(figsize=(8, 4), dpi=120)
#繪製折線圖
#linewidth引數指定線條的粗細,預設值是1
#marker引數指定線條的標記(用什麼符號來畫曲線),預設值是None,即不顯示標記
#color引數指定線條的顏色,預設值是黑色
plt.plot(x, y, linewidth=2, marker='+', color='red')

#如果要同時顯示和儲存圖表,應該先執行savefig函式,再執行show函式,因為在呼叫show函式時,圖表已經被釋放,位於show函式之後的savefig儲存的只是一個空白的區域
#儲存圖片
plt.savefig('直方圖.png')
#顯示繪圖
plt.show()

散點圖

# -*- coding: utf-8 -*-
#散點圖

import matplotlib.pyplot as plt
import numpy as np

x = np.array([5550, 7500, 10500, 15000, 20000, 25000, 30000, 40000])
y = np.array([800, 1800, 1250, 2000, 1800, 2100, 2500, 3500])

#建立畫布
plt.figure(figsize=(8, 6), dpi=120)
#繪製散點圖
#scatter 函式表示作用是繪製散點圖
# plt.scatter(x, y)   #預設
# 自定義散點圖
plt.scatter(x, y, s=100, c='red', alpha=0.5, marker='o', label='Data Points')


# 新增顏色條
# plt.colorbar(label='Color Mapping')

# 新增標題和標籤
plt.title("Simple Scatter Plot")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")

#如果要同時顯示和儲存圖表,應該先執行savefig函式,再執行show函式,因為在呼叫show函式時,圖表已經被釋放,位於show函式之後的savefig儲存的只是一個空白的區域
#儲存圖片
plt.savefig('直方圖.png')
plt.show()

柱狀圖

# -*- coding: utf-8 -*-
#柱狀圖

import matplotlib.pyplot as plt
import numpy as np

#在對比資料的差異時,柱狀圖是非常棒的選擇,我們可以使用pyplot模組的bar函式來生成柱狀圖,也可以使用barh函式來生成水平柱狀圖(也稱為“條狀圖”)

#設定字型
plt.rcParams['font.sans-serif'].insert(0, 'SimHei')
plt.rcParams['axes.unicode_minus'] = False  # 解決負號'-'顯示為方塊的問題

x = np.arange(4)
y1 = np.random.randint(20, 50, 4)
y2 = np.random.randint(10, 60, 4)

#繪製畫布
plt.figure(figsize=(6, 4), dpi=120)
#繪製柱狀圖
## 透過橫座標的偏移,讓兩組資料對應的柱子分開,width引數控制柱子的粗細,label引數為柱子新增標籤
plt.bar(x - 0.1, y1, width=0.2, label='A組')
plt.bar(x + 0.1, y2, width=0.2, label='B組')

#定製橫軸 x 的刻度
plt.xticks(x, ['Q1', 'Q2', 'Q3', 'Q4']) #如果不定製、會預設顯示 按x或y軸的資料來畫

#配置label標籤的位置
#'best':自動選擇最合適的位置(預設值)
#'upper right':右上角
#'upper left':左上角
#'lower left':左下角
#'lower right':右下角
#'right':右側
#'center left':左側居中
#'center right':右側居中
#'lower center':下方居中
#'upper center':上方居中
#'center':居中
plt.legend(loc='upper right')

#如果要同時顯示和儲存圖表,應該先執行savefig函式,再執行show函式,因為在呼叫show函式時,圖表已經被釋放,位於show函式之後的savefig儲存的只是一個空白的區域
#儲存圖片
plt.savefig('直方圖.png')
#顯示圖形
plt.show()

堆疊柱狀圖

# -*- coding: utf-8 -*-
#堆疊柱狀圖

import matplotlib.pyplot as plt
import numpy as np

#設定字型
plt.rcParams['font.sans-serif'].insert(0, 'SimHei')
plt.rcParams['axes.unicode_minus'] = False  # 解決負號'-'顯示為方塊的問題

x = np.arange(4)
y1 = np.random.randint(20, 50, 4)
y2 = np.random.randint(10, 60, 4)

labels = ['Q1', 'Q2', 'Q3', 'Q4']

#繪製畫布
plt.figure(figsize=(6, 4), dpi=120)

#繪製柱狀圖
plt.bar(labels, y1, width=0.4, label='A組')
## 注意:堆疊柱狀圖的關鍵是將之前的柱子作為新柱子的底部,可以透過bottom引數指定底部資料,新柱子繪製在底部資料之上
#bottom 引數指定為y1,即在A組柱子的資料上
plt.bar(labels, y2, width=0.4, bottom=y1, label='B組')

#配置label標籤的位置
#'best':自動選擇最合適的位置(預設值)
#'upper right':右上角
#'upper left':左上角
#'lower left':左下角
#'lower right':右下角
#'right':右側
#'center left':左側居中
#'center right':右側居中
#'lower center':下方居中
#'upper center':上方居中
#'center':居中
plt.legend(loc='upper right')

#如果要同時顯示和儲存圖表,應該先執行savefig函式,再執行show函式,因為在呼叫show函式時,圖表已經被釋放,位於show函式之後的savefig儲存的只是一個空白的區域
#儲存圖片
plt.savefig('直方圖.png')
#顯示
plt.show()

餅狀圖

# -*- coding: utf-8 -*-
#餅狀圖
#是一個將資料劃分為幾個扇形區域的統計圖表,它主要用於描述數量、頻率等之間的相對關係
#在需要展示資料構成的場景下,餅狀圖、樹狀圖和瀑布圖是不錯的選擇,我們可以使用pyplot模組的pie函式來繪製餅圖


import matplotlib.pyplot as plt
import numpy as np

#設定字型
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

#準備資料
data = np.random.randint(100, 500, 7)   #隨機生成7個資料、隨機生成100-500之間的整數
labels = ['蘋果', '香蕉', '桃子', '荔枝', '石榴', '山竹', '榴蓮']

#繪製畫布
plt.figure(figsize=(5, 5), dpi=120)

#繪製餅圖
plt.pie(
    data,
    #自動顯示百分比
    autopct='%.1f%%',
    #餅圖的半徑
    radius=1,
    #百分比到餅圖中心的距離
    pctdistance=0.8,
    #顏色(隨機生成)
    colors=np.random.rand(7, 3),
    #分離距離、數量要與data長度一致
    explode=[0.05, 0, 0.1, 0, 0, 0, 0],
    #陰影效果
    shadow=True,
    #字型屬性
    textprops=dict(fontsize=10, color='black'),
    # # 楔子屬性(生成環狀餅圖的關鍵)
    wedgeprops=dict(linewidth=1, width=0.35),
    #標籤
    labels=labels
)

#定製圖表標題
plt.title('水果銷量', fontsize=15)

#如果要同時顯示和儲存圖表,應該先執行savefig函式,再執行show函式,因為在呼叫show函式時,圖表已經被釋放,位於show函式之後的savefig儲存的只是一個空白的區域
#儲存圖片
plt.savefig('直方圖.png')
plt.show()

直方圖

# -*- coding: utf-8 -*-
#直方圖
#在統計學中,直方圖是一種展示資料分佈情況的圖形,是一種二維統計圖表,它的兩個座標分別是統計樣本和該樣本對應的某個屬性的度量
#使用pyplot模組的hist函式來繪製直方圖,其中bins引數代表了我們使用的分箱方式

import matplotlib.pyplot as plt
import numpy as np

#設定字型
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

#建立資料- 陣列
heights = np.array([
    170, 163, 174, 164, 159, 168, 165, 171, 171, 167,
    165, 161, 175, 170, 174, 170, 174, 170, 173, 173,
    167, 169, 173, 153, 165, 169, 158, 166, 164, 173,
    162, 171, 173, 171, 165, 152, 163, 170, 171, 163,
    165, 166, 155, 155, 171, 161, 167, 172, 164, 155,
    168, 171, 173, 169, 165, 162, 168, 177, 174, 178,
    161, 180, 155, 155, 166, 175, 159, 169, 165, 174,
    175, 160, 152, 168, 164, 175, 168, 183, 166, 166,
    182, 174, 167, 168, 176, 170, 169, 173, 177, 168,
    172, 159, 173, 185, 161, 170, 170, 184, 171, 172
])

#繪製畫布
plt.figure(figsize=(6, 4), dpi=120)

#繪製直方圖
#bins: 直方圖的分箱方式、bins陣列可以用於定義每個柱的邊界
#density: 是否將頻率轉換為機率密度 density=True時:直方圖顯示的是機率密度而不是頻數。這樣,每個柱的高度表示在該區間內資料的機率密度,而整個直方圖的面積和為1。
#cumulative: 是否將頻率轉換為累計頻率
#numpy.arange(145, 196, 5):生成從145到195的一個步長為5的數列 - 表示X軸
#橫軸(X軸)代表身高的範圍 縱軸(Y軸)代表人數(統計數量)
# plt.hist(heights, bins=np.arange(145, 196, 5), color='darkcyan')  #'darkcyan' 是一種深青色
plt.hist(heights, bins=np.arange(145, 196, 5), color='darkcyan', density=True, cumulative=True)

#設定x軸標籤
plt.xlabel('身高')
#設定y軸標籤
plt.ylabel('人數')
#設定標題
plt.title('身高直方圖')

#如果要同時顯示和儲存圖表,應該先執行savefig函式,再執行show函式,因為在呼叫show函式時,圖表已經被釋放,位於show函式之後的savefig儲存的只是一個空白的區域
#儲存圖片
plt.savefig('直方圖.png')
#顯示
plt.show()

相關文章