Python數據挖掘基礎(一):Matplotlib

1. 繪製折線圖

折線圖將值標註成點,並通過直線將這些按照某種順序連接起來形成的圖。場景:數據在一個有序的因變量上的變化,它的特點是反應事物隨類別而變化的趨勢,可以清晰展現數據的增減趨勢、增減的速率、增減的規律、峯值等特徵。優點:

  1. 能很好的展現沿某個維度的變化趨勢
  2. 能比較多組數據在同一個維度上的趨勢
  3. 適合展現較大數據集

需求1: 畫出廈門及北京兩個城市11點到12點1小時內每分鐘的溫度變化折線圖。廈門溫度範圍在15度~18度 北京溫度範圍在1度~3度。示例代碼如下:

import matplotlib.pyplot as plt
import random

# 1.創建一個新圖 簡單理解爲一個畫板
# figsize可選:指定圖的寬高 dpi: 圖的分辨率 返回一個fig對象
plt.figure(figsize=(20, 8), dpi=80)

# 2.構造x,y座標的數據
x = range(60)  # x座標: 模擬0-60分鐘
# random.uniform用於生成一個指定範圍內的隨機符點數
y_xiamen = [random.uniform(15,18) for i in range(60)]  # 廈門溫度
y_beijing = [random.uniform(1,3) for i in range(60)]  # 北京溫度

# 3.畫折線圖
plt.plot(x, y_xiamen, label="廈門")  # 廈門溫度顯示
# color: 顏色 linestyle: 線型
plt.plot(x, y_beijing, label="北京", color="r", linestyle="--")  # 北京溫度顯示

# 4.美化折線圖
# 構造中文列表的字符串
x_ch = ["11點{}分".format(i) for i in x]
y_ticks = range(40)

# 4.1 添加刻度: 修改x,y座標的刻度
plt.xticks(x[::5], x_ch[::5])  # x: 要顯示的刻度值
plt.yticks(y_ticks[::5])
# plt.yticks(y_ticks[::5])

# 4.2 增加標題 x軸/y軸描述信息
plt.xlabel("時間")
plt.ylabel("溫度")
plt.title("一些城市中午11點0分到12點之間的溫度變化圖示")

# 4.3 添加圖例: 默認值爲最佳loc="best" 也可以省略 可以根據實際情況自行設置
# loc除了設置爲best之外 還有可以設置爲 upper/lower/center left/right/center 並且可以使用數字代替 
# plt.legend(loc="center left")
plt.legend(loc=2) # 2代表左上 寫數字並不直觀
plt.legend(loc="best")  # 0,"best" 代表右上

plt.savefig("weather.png")  # 保存圖形到本地
# 5.顯示圖形
plt.show()

上述代碼執行結果如下:
在這裏插入圖片描述
顏色color設置如下表:
在這裏插入圖片描述
線型linestyle設置如下表:
在這裏插入圖片描述
需求2:將廈門和北京的天氣圖顯示在同一個圖的不同座標系當中,示例代碼如下:

import matplotlib.pyplot as plt
import random

# 兩個城市的溫度 在多個座標系中顯示
# 1.創建新圖 一個白白的畫板
# nrows:1行 ncols:2列 就是一行兩個不同的座標系 可以簡寫爲1,2
# fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(20, 8))
fig, ax = plt.subplots(1, 2, figsize=(20, 8))
# 2.準備數據
x = range(60)  # 0-59分
y_xiamen = [random.uniform(15, 18) for i in range(60)]  # 準備廈門溫度
y_beijing = [random.uniform(1, 3) for i in range(60)]  # 準備北京溫度

# 3.顯示
ax[0].plot(x, y_xiamen, label="廈門")  # 廈門顯示
ax[1].plot(x, y_beijing, label="北京", ls="--", color="r")  # 北京顯示 ls: linestyle縮寫

# 4.美化座標系
x_ch = ["11點{}分".format(i) for i in x]  # 中文刻度
y_ticks = range(40)  # y軸刻度
# 4.1 設置刻度值
ax[0].set_xticks(x[::5], x_ch[::5])
ax[0].set_yticks(y_ticks[::5])
ax[1].set_xticks(x[::5], x_ch[::5])
ax[1].set_yticks(y_ticks[::5])
# 4.2 設置label
ax[0].set_xlabel("時間")
ax[0].set_ylabel("溫度")  # 給第一個圖設置label
ax[1].set_xlabel("時間")
ax[1].set_ylabel("溫度")  # 給第二個圖設置label
# 4.3 分別給每個圖設置title
ax[0].set_title("中午11點0分到12點之間的溫度變化圖示")
ax[1].set_title("中午11點0分到12點之間的溫度變化圖示")
# 4.4 分別給每個圖設置圖例
ax[0].legend(loc="best")
ax[1].legend(loc="best")  # 注意: 當在多個ax裏面畫圖的時候 刻度 標籤 必須在相應的座標系裏面指定

# 5.顯示圖形
plt.show()

上述代碼執行結果如下:
在這裏插入圖片描述

2. 繪製柱狀圖

柱狀圖是一種以長方形的長度來表達數據的統計報告圖,由一系列高度不等的縱向條紋表示數據分佈的情況。適合用於展示二維數據集,展示數據的分佈情況,其中一個軸表示需要對比的分類維度,另一個軸代表相應的數值,比如:(月份,商品銷量) 或者在一個維度上,對多個同質可比的指標的比較,比如:月份,蘋果銷量,桃子產量。

需求1:畫出每部電影的票房收入對比。電影數據如下圖所示:
在這裏插入圖片描述
示例代碼如下:

# 需求:電影票房數據的對比(柱狀圖)
# 1.創建一個新圖 即畫板
plt.figure(figsize=(20, 8), dpi=80)

# 2.準備數據
movie_name_list = ["寵愛", "葉問4: 完結篇", "誤殺", "我爲你犧牲", 
                   "變身特工", "美麗人生","天使陷落", "紫羅蘭永恆花園 外傳:永遠與自動手記人偶"]
x = range(len(movie_name_list))
y = [51033, 41834, 37528, 10606, 10341, 5982, 5506, 4850]

# 3.畫出柱狀圖
# 注意: 填入的x座標必須全是數字
plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k'])

# 4.修改刻度,以及電影名字顯示
plt.xticks(x, movie_name_list)

# 5.顯示
plt.show()

上述代碼執行結果如下:
在這裏插入圖片描述
有時候爲了公平起見,我們需要對比不同電影首日和首周的票房,數據如下:

movie_name_list = ["雷神3:諸神黃昏","正義聯盟","尋夢環遊記"]  # 電影名字
first_day = [10587.6,10062.5,1275.7]  # 票房數據
first_weekend=[36224.9,34479.6,11830]

示例代碼如下:

# 不同電影的首日、首周的票房對比
# 1.創建新圖
plt.figure(figsize=(20, 8), dpi=80)

# 2.準備數據
movie_name_list = ["雷神3:諸神黃昏","正義聯盟","尋夢環遊記"]  # 電影名字
first_day = [10587.6,10062.5,1275.7]  # 票房數據
first_weekend=[36224.9,34479.6,11830]
x = range(len(movie_name_list))

# 3.畫柱狀圖
plt.bar(x, first_day, width=0.2, label="首日票房")
plt.bar([i+0.2 for i in x], first_weekend, width=0.2, label="首周票房")

# 4.美化
# 替換刻度值
plt.xticks([i+0.1 for i in x], movie_name_list)
plt.legend(loc="best")  # 添加圖例

# 5.顯示
plt.show()

上述代碼執行結果如下:
在這裏插入圖片描述

3. 繪製直方圖

直方圖形狀類似柱狀圖卻有着與柱狀圖完全不同的含義。直方圖牽涉統計學的概念,首先要對數據進行分組,然後統計每個分組內數據元的數量。 在座標系中,橫軸標出每個組的端點,縱軸表示頻數,每個矩形的高代表對應的頻數,稱這樣的統計圖爲頻數分佈直方圖。

需求1:現有250部電影的時長, 希望統計出這些電影時長的分佈狀態(比如時長爲100分鐘到120分鐘電影的數量/出現的頻率)等信息。示例代碼如下:

import matplotlib.pyplot as plt

# 電影時長分佈直方圖
# 1.創建新圖
plt.figure(figsize=(20, 8), dpi=80)

# 2.準備數據
bins = 2  # 組距
time_list = [131,  98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115,  99, 136, 126, 134,  95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117,  86,  95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123,  86, 101,  99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140,  83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144,  83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137,  92,121, 112, 146,  97, 137, 105,  98, 117, 112,  81,  97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112,  83,  94, 146, 133, 101,131, 116, 111,  84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
group = int((max(time_list)-min(time_list))/2)

# 3.繪製直方圖
plt.hist(time_list, group)

# 4.美化
# 指定刻度的範圍,以及步長
plt.xticks(range(min(time_list), max(time_list))[::2])
plt.xlabel("電影時長大小")
plt.ylabel("電影的數據量")  # 設置label
plt.grid(True, linestyle="--", alpha=0.5)  # 添加網格

# 5.顯示圖形
plt.show()

上述代碼執行結果如下:
在這裏插入圖片描述

4. 繪製餅圖

餅圖廣泛的應用在各個領域,用於表示不同分類佔比情況,通過弧度大小來對比各種分類。餅圖通過將一個圓餅按照分類的佔比劃分成多個區塊,整個圓餅代表數據的總量,每個區塊(圓弧)表示該分類佔總體的比例大小,所有區塊(圓弧)的加和等於 100%。

需求1:基本餅圖演示以及一些其他功能。示例代碼如下:

import matplotlib.pyplot as plt

# 基本餅圖演示以及一些其他功能
# 1.創建新圖
plt.figure(figsize=(20, 8))

# 2.構造數據
labels = ["Frogs", "Hogs", "Dogs", "Logs"]  # 分類
sizes = [15, 30, 45, 10]  # 佔比
explode = (0, 0.1, 0, 0)

# 3.畫圖
# labels: 每部分的名稱
# autopct: 佔比顯示指定
# explode: 偏移
# shadow: 陰影
# startangle: 不爲None 則將餅形圖的起點 從x軸逆時針旋轉角度
plt.pie(sizes, labels=labels, autopct="%1.1f%%", explode=explode, shadow=True, startangle=90)
plt.axis("equal")  # 等寬高比可確保將餅圖繪製爲圓

# 4.顯示
plt.show()

上述代碼執行結果如下:
在這裏插入圖片描述
更多畫圖功能請參考:畫圖實例

5. 解決中文亂碼問題

5.1 windows版

在創建新圖之後,添加以下兩行代碼即可:

plt.rcParams['font.sans-serif']=['SimHei'] # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號

示例圖如下:
在這裏插入圖片描述

5.2 Mac版

  1. 下載相關的中文字體simhei文件: 下載地址
  2. 通過以下代碼查找matplotlib的數據存放位置:
    import matplotlib
    matplotlib.matplotlib_fname()
    
    運行結果如圖所示:
    在這裏插入圖片描述
  3. 使用終端打開上述目錄,並將下載的字體文件simhei.ttf複製到上述目錄的fonts/ttf/目錄中,如下圖所示:
    在這裏插入圖片描述
    在這裏插入圖片描述
  4. 在上述目錄中用sublime(或其他記事本工具或vi/vim) 打開matplotlibrc,找到#font.sans-serif開頭的這一行,去掉#,並加上SimHei,如下:
    在這裏插入圖片描述
  5. #axes.unicode_minus : True 去掉註釋並改爲False,如果不修改,會導致座標軸的負號顯示不出來,如下:
    在這裏插入圖片描述
  6. 在終端執行rm -rf ~/.matplotlib/,然後重啓jupyter或者在jupyter裏面重啓服務都可,如下:
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章