08【matplotlib】06matplotlib繪製多次圖形和不同圖形的差異介紹和總結

yuhui_2000發表於2020-11-28

動手

題目

假設大家在30歲的時候,根據自己的實際情況,統計出來了從11歲到30歲每年交的女(男)朋友的數量如列表a,請繪製出該資料的折線圖,以便分析自己每年交女(男)朋友的數量走勢

a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]

要求:
y軸表示個數
x軸表示歲數,比如11歲,12歲等

程式碼+結果

程式碼

# -*- coding: utf-8 -*-

'''
@Time    : 2020/11/28 12:26
@Author  : yuhui
@Email   : 3476237164@qq.com
@FileName: matplotlib_4.py
@Software: PyCharm
'''

"""08【matplotlib】06matplotlib繪製多次圖形和不同圖形的差異介紹和總結"""

"""
假設大家在30歲的時候,根據自己的實際情況,統計出來了從11歲到30歲每年交的女(男)朋友的數量如列表a,請繪製出該資料的折線圖,以便分析自己每年交女(男)朋友的數量走勢
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
要求:
    y軸表示個數
    x軸表示歲數,比如11歲,12歲等
"""

import matplotlib.pyplot as plt

# 解決中文亂碼
plt.rcParams["font.sans-serif"]=["KaiTi"]
plt.rcParams["font.family"]="sans-serif"
# 解決符號無法顯示的問題
plt.rcParams['axes.unicode_minus'] = False # 解決儲存影像時負號'-'顯示為方塊的問題

fig=plt.figure(
    figsize=(16,9),
    dpi=100
)

"""x軸資料和y軸資料"""
x=range(11,31)  # 11歲到30歲
y=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]

plt.plot(x,y)

"""調整x軸和y軸的刻度"""

# 調整y軸的刻度
_y=y
plt.yticks(range(min(_y),max(_y)))

# 調整x軸的刻度
_x=x
_xticks=[f"{i}歲" for i in range(11,31)]
plt.xticks(_x,_xticks,rotation=45)

"""新增描述性資訊"""
plt.xlabel("年齡/歲")
plt.ylabel("人數/人")
plt.title("從11歲到30歲每年交的女(男)朋友的數量")

# 展示
plt.show()

結果
在這裡插入圖片描述

為影像背景新增網格線

我們通過網格線能夠大概地知道這個點大概是在什麼位置

預設情況下

在這裡插入圖片描述

在這裡插入圖片描述
在這種情況下,matplotlib是如何繪製網格線的?

這種情況:沒有傳遞任何引數,也就是預設的情況
在這裡插入圖片描述

在這裡插入圖片描述

那麼,在這種情況下,我們應該如何設定網格線的密集程度呢?

可以通過改變x軸和y軸的刻度的疏密程度來改變網格線的密集程度

在這裡插入圖片描述
在這裡插入圖片描述

設定網格線的屬性

透明度

在這裡插入圖片描述

在這裡插入圖片描述

最終的程式碼+結果

# -*- coding: utf-8 -*-

'''
@Time    : 2020/11/28 12:26
@Author  : yuhui
@Email   : 3476237164@qq.com
@FileName: matplotlib_4.py
@Software: PyCharm
'''

"""08【matplotlib】06matplotlib繪製多次圖形和不同圖形的差異介紹和總結"""

"""
假設大家在30歲的時候,根據自己的實際情況,統計出來了從11歲到30歲每年交的女(男)朋友的數量如列表a,請繪製出該資料的折線圖,以便分析自己每年交女(男)朋友的數量走勢
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
要求:
    y軸表示個數
    x軸表示歲數,比如11歲,12歲等
"""

import matplotlib.pyplot as plt

# 解決中文亂碼
plt.rcParams["font.sans-serif"]=["KaiTi"]
plt.rcParams["font.family"]="sans-serif"
# 解決符號無法顯示的問題
plt.rcParams['axes.unicode_minus'] = False # 解決儲存影像時負號'-'顯示為方塊的問題

fig=plt.figure(
    figsize=(16,9),
    dpi=100
)

"""x軸資料和y軸資料"""
x=range(11,31)  # 11歲到30歲
y=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]

plt.plot(x,y)

"""調整x軸和y軸的刻度"""

# 調整y軸的刻度
_y=y
# plt.yticks(range(min(_y),max(_y)))

# 調整橫向網格線的疏密程度
plt.yticks(range(9))

# 調整x軸的刻度
_x=x
_xticks=[f"{i}歲" for i in range(11,31)]
plt.xticks(_x,_xticks,rotation=45)

"""新增描述性資訊"""
plt.xlabel("年齡/歲")
plt.ylabel("人數/人")
plt.title("從11歲到30歲每年交的女(男)朋友的數量")

"""設定圖片的背景"""
# 繪製網格線
plt.grid(
    alpha=0.4,  # 透明度  0~1  透明~不透明
)


# 展示
plt.show()

在這裡插入圖片描述

再動手一次

題目

假設大家在30歲的時候,根據自己的實際情況,統計出來了你和你同桌各自從11歲到30歲每年交的女(男)朋友的數量如列表a和b,請在一個圖中繪製出該資料的折線圖,以便比較自己和同桌20年間的差異,同時分析每年交女(男)朋友的數量走勢

a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]

要求:
y軸表示個數
x軸表示歲數,比如11歲,12歲等

程式碼+結果1.0

# -*- coding: utf-8 -*-

'''
@Time    : 2020/11/28 13:38
@Author  : yuhui
@Email   : 3476237164@qq.com
@FileName: matplotlib_5.py
@Software: PyCharm
'''

"""08【matplotlib】06matplotlib繪製多次圖形和不同圖形的差異介紹和總結"""

"""
假設大家在30歲的時候,根據自己的實際情況,統計出來了你和你同桌各自從11歲到30歲每年交的女(男)朋友的數量如列表a和b,請在一個圖中繪製出該資料的折線圖,以便比較自己和同桌20年間的差異,同時分析每年交女(男)朋友的數量走勢
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
要求:
    y軸表示個數
    x軸表示歲數,比如11歲,12歲等
"""

import matplotlib.pyplot as plt

# 解決中文亂碼
plt.rcParams["font.sans-serif"]=["KaiTi"]
plt.rcParams["font.family"]="sans-serif"
# 解決符號無法顯示的問題
plt.rcParams['axes.unicode_minus'] = False # 解決儲存影像時負號'-'顯示為方塊的問題

fig=plt.figure(
    figsize=(16,9),
    dpi=100
)

"""x軸資料和y軸資料"""
x=range(11,31)  # 11歲到30歲
y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]  # 自己
y_2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]  # 同桌

# 在同一張畫布上同時繪製出兩個圖
plt.plot(x,y_1)
plt.plot(x,y_2)

# 設定x軸和y軸的刻度資料

# x軸
_x=x
_xticks=[f"{i}歲" for i in range(11,31)]
plt.xticks(_x,_xticks)

# y軸
_y=y_1+y_2
plt.yticks(range(min(_y),max(_y)+1))

# 繪製網格線
plt.grid(
    alpha=0.4,
)

plt.show()


在這裡插入圖片描述

問題

當我們將這個圖給別人看的時候,別人可能不會很明白,哪個顏色對應的是哪一組資料。

在這裡插入圖片描述

為每一條線新增標註

在這裡插入圖片描述

在這裡插入圖片描述
如何改變圖例框的位置?

在這裡插入圖片描述

        ===============   =============
        Location String   Location Code
        ===============   =============
        'best'            0
        'upper right'     1
        'upper left'      2
        'lower left'      3
        'lower right'     4
        'right'           5
        'center left'     6
        'center right'    7
        'lower center'    8
        'upper center'    9
        'center'          10
        ===============   =============

在這裡插入圖片描述

設定圖線的屬性

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

顏色

在這裡插入圖片描述
在這裡插入圖片描述

線型

在這裡插入圖片描述
在這裡插入圖片描述

同理,我們也可以通過這個引數設定網格線的線型

在這裡插入圖片描述
在這裡插入圖片描述

線的粗細

在這裡插入圖片描述
在這裡插入圖片描述

再談線的顏色

如果我們想不到一個合適的單詞來形容自己想要的顏色,其實是可以使用顏色的十六進位制

https://www.sioe.cn/yingyong/yanse-rgb-16/
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

總結

  • 繪製了折線圖
plt.plot()
  • 設定了圖片的大小和解析度
fig=plt.figure(
    figsize=(16,9),
    dpi=100
)
  • 實現了圖片的儲存
plt.savefig("../data/fig_size.svg")
  • 設定了x、y軸上的刻度和字串
"""設定x軸和y軸上的刻度間距"""

# y軸刻度間距
_yticks=range(min(y),max(y))
plt.yticks(_yticks)

# 調整x軸的刻度

# 將x軸上的刻度字元由數字轉變為字串
# _x=list(x)[::10]  # 取步長為10
# _xticks=[f"hello,{i}" for i in _x]
# plt.xticks(_x,_xticks)
"""注意:
當x軸上的刻度是數字的時候,對於plt.xticks()我們只需要傳遞一個引數,這個引數它是數字,plt.xticks會把這個引數全部繪製在x軸上;
當x軸上的刻度是字串的時候,我們需要傳遞兩個引數,一個是數字,一個是字串,我們要將字串和數字進行一一對應,由於是一一對應的關係,所以說,數字的長度和字串的長度必須是一樣的
"""

# 設定x軸上刻度字元為“XX點XX分”
_x=list(x)
_xticks=[f"10點{i}分" for i in range(60)]
_xticks+=[f"11點{i}分" for i in range(60)]
plt.xticks(_x[::10],_xticks[::10],rotation=45)  # 注意保證數字和字串之間是一一對應的關係
# rotation=90  旋轉的度數
# 把數值型資料對應在字串上
  • 解決了刻度稀疏和密集的問題

# 設定x軸的刻度
# plt.xticks(x)

# 設定x軸刻度的間隔
# plt.xticks(range(2,26,1))  # 間隔為1  密集
# plt.xticks(range(2,26,10))  # 間隔為10  稀疏

# 設定間隔為0.5  自己傳入一個列表
# plt.xticks([0.5*i for i in range(4,49)])
# 感覺有點太密集了  怎麼變稀疏呢  取步長
plt.xticks([0.5*i for i in range(4,49)][::3])

# plt.xticks(range(25,50))  # 傳遞一個錯誤的刻度

# 調整y軸的刻度的間隔
# plt.yticks([15,13,14.5,17,20,25,26,26,27,22,18,15])

plt.yticks(range(min(y),max(y)+1))

  • 設定了標題、x、y軸的標籤
"""給影像新增描述資訊"""
plt.xlabel("時間/min")  # 設定x軸的描述資訊
plt.ylabel("溫度/℃")  # 設定y軸的描述資訊
plt.title("10點到12點每分鐘的氣溫變化情況")  # 圖的標題

  • 設定了中文字型
# 解決中文亂碼
plt.rcParams["font.sans-serif"]=["KaiTi"]
plt.rcParams["font.family"]="sans-serif"
# 解決符號無法顯示的問題
plt.rcParams['axes.unicode_minus'] = False # 解決儲存影像時負號'-'顯示為方塊的問題

  • 在一個圖上繪製多個圖形
"""x軸資料和y軸資料"""
x=range(11,31)  # 11歲到30歲
y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]  # 自己
y_2 = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]  # 同桌

# 在同一張畫布上同時繪製出兩個圖
plt.plot(
    x,y_1,
    label="自己",
    # color="orange",  # 線的顏色
    color="#00FF00",  # 線的顏色  	Lime	酸橙色	#00FF00	0,255,0
    linestyle="--",  # 線型
    linewidth=5,  # 粗細

)

plt.plot(x,y_2,label="同桌",
         color="#BA55D3",  # MediumOrchid	適中的蘭花紫	#BA55D3	186,85,211
         # color="cyan",
        linestyle=":",
linewidth=3,
         )
  • 為不同的圖線新增圖例
# 在同一張畫布上同時繪製出兩個圖
plt.plot(
    x,y_1,
    label="自己",
    # color="orange",  # 線的顏色
    color="#00FF00",  # 線的顏色  	Lime	酸橙色	#00FF00	0,255,0
    linestyle="--",  # 線型
    linewidth=5,  # 粗細

)

plt.plot(x,y_2,label="同桌",
         color="#BA55D3",  # MediumOrchid	適中的蘭花紫	#BA55D3	186,85,211
         # color="cyan",
        linestyle=":",
linewidth=3,
         )


# 讓“自己”和“同桌”這兩個label在圖上顯示出來
# 新增圖例
plt.legend(
    loc="lower right",  # 改變圖例框的位置
)
# plt.legend()會結合plt.plot中的label引數,將標註顯示在圖上

以上統統很重要

matplotlib官方文件

https://matplotlib.org/

在這裡插入圖片描述

https://matplotlib.org/api/pyplot_summary.html

在這裡插入圖片描述

對比常用統計圖

https://www.cnblogs.com/springionic/p/11147960.html

在這裡插入圖片描述

相關文章