matplotlib學習

一: 什麼是matplotlib?app

matplotlib:最流行的Python底層繪圖庫,主要作數據可視化圖標,名字取材於MATLAB,模仿MATLAB構建。dom

二:繪製折線圖:spa

  

  每一個紅色的點是座標,把5個點的座標鏈接成一條線,就組成了折線圖3d

  經過下面的小例子來看一下matplotlib該如何簡單使用code

  

假設一天中每隔兩個小時(range(2,26,2))的氣溫(℃)分別是[15,13,14.5,17,20,25,26,26,27,22,18,15]

  

from matplotlib import pyplot as plt 

# 數據在x軸的位置,是一個可迭代對象
x = range(2, 26, 2) 

# 數據在y軸的位置,是一個可迭代對象
y = [15, 13, 14, 5, 17, 20, 25, 26, 24, 22, 18, 12] 

#x軸和y軸的數據一塊兒組成了全部藥繪製出的座標¶
#傳入x和y,經過plot繪製出折線圖
plt.plot(x,y)
plt.show()  # 在pycharm中展現圖形,Juptyer notebook不用

  目前就簡單的繪製出一個折線圖,可是目前存在如下幾個問題:orm

  1.設置圖片的大小(想要一個高清無碼大圖) 對象

plt.figure(figsize=(20,8),dpi=80)

  ——→ figure圖形圖標的意思,這裏指明咱們要畫的圖blog

  ——→經過實例化一個figure而且傳遞參數,可以在後臺自動使用該figure實例圖片

  ——→在圖像模糊的時候,能夠傳入dpi參數,讓圖片更加清晰pycharm

  2.保存到本地

plt.savefig("./sig_size.png")

  3.描述信息,好比x軸和y軸表示什麼,這個圖表示什麼? 

plt.xlabel("時間")  # 這樣添加中文會顯示亂碼,須要設置fontproperties
plt.ylabel("溫度 單位(℃)")
plt.title("10點到12點每分鐘氣溫變化")

  4.調整x或y的刻度間距

plt.xticks(x)  # 設置x刻度
# plt.xticks(x[::2]) # 當刻度太密集的時候,使用列表的步長(間隔取值)來解決,

  那麼問題來了:

    若是列表a表示10點到12點的每一分鐘的氣溫,如何繪製折線圖觀察每分鐘氣溫變化狀況?  

   a = [random.randint(20,35) for i in range(120)]
   

    xtick_labels = ["10點{}分".format(i) for i in range(60)]  # 設置x軸上的刻度
    xtick_labels += ["11點{}分".format(i) for i in range(60)]

 

    plt.xticks(_x, xtick_labels[::3], rotation=90)  # 中文顯示不出來,須要設置fontproperties,rotation=90表示旋轉90°

  

  matplotlib默認不支持中文字符,經過font_manager解決  

from matplotlib import font_manager

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf")

 plt.xlabel("時間", fontproperties=my_font)
 plt.ylabel("溫度 單位(℃)", fontproperties=my_font)
 plt.title("10點到12點每分鐘氣溫變化", fontproperties=my_font)

  5.線條的樣式(好比顏色,透明度等)

 

  完整代碼:

import random
from matplotlib import font_manager
from matplotlib import pyplot as plt

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf")

x = range(0, 120)
y = [random.randint(20, 35) for i in range(120)]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y)

# 調整x的刻度
_x = list(x)[::3]
print(_x)
xtick_labels = ["10點{}分".format(i) for i in range(60)]
xtick_labels += ["11點{}分".format(i) for i in range(60)]
print(xtick_labels)
plt.xticks(_x, xtick_labels[::3], rotation=45, fontproperties=my_font)

# 添加描述信息
plt.xlabel("時間", fontproperties=my_font)
plt.ylabel("溫度 單位(℃)", fontproperties=my_font)
plt.title("10點到12點每分鐘氣溫變化", fontproperties=my_font)

plt.show()

 

 動手1:

  假設你們在30歲的時候,根據本身的實際狀況,統計出來了從11歲到30歲每一年交的女(男)朋友數量如列表啊,請繪製出該數據的折線圖,以便分析本身每一年交女(男)朋友的數量走勢

 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歲

from matplotlib import pyplot as plt, font_manager

a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
x = range(11, 31)

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf")

plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, a)

plt.xticks(x, ["{}歲".format(i) for i in x], rotation=45, fontproperties=my_font)
plt.yticks(a)

plt.ylabel("數量:個", fontproperties=my_font)
plt.xlabel('年齡', fontproperties=my_font)
plt.title("11歲到30歲每一年交的男女友數量統計", fontproperties=my_font)

# 繪製網格
plt.grid(alpha=0.3)

plt.show()

  動手2:假設你們在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歲
from matplotlib import pyplot as plt, font_manager

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]
x = range(11, 31)

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf")

plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, a, label="本身", color="r", linestyle="--")
plt.plot(x, b, label="同桌", color="y")

plt.xticks(x, ["{}歲".format(i) for i in x], rotation=45, fontproperties=my_font)
plt.yticks(a)

plt.ylabel("數量:個", fontproperties=my_font)
plt.xlabel('年齡', fontproperties=my_font)
plt.title("11歲到30歲每一年交的男女友數量統計", fontproperties=my_font)

# 繪製網格
plt.grid(alpha=0.3)

# 添加圖例
plt.legend(prop=my_font)  # 只有在legend中用prop添加顯示中文

plt.show()

   

    折線圖更多應用場景:

      呈現公司產品(不一樣區域)天天活躍用戶數

      呈現app天天下載數量

      呈現產品新功能上線後,用戶點擊次數隨時間的變化

      呈現員工天天上下班時間

  

 三:繪製散點圖

  1.技術要點: plt.scatter(x,y)

  2.假設經過爬蟲獲取到了北京2016年3,10月份天天白天的最高氣溫(分別位於列表a,b),那麼此時如何找出氣溫和隨時間變化的某種規律?  

  a = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
  b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
  
from matplotlib import pyplot as plt
from matplotlib import font_manager

a = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]

x_3 = range(0,31)
x_10 = range(51,82)
# 設置圖形大小
plt.figure(figsize=(20,8), dpi=80)

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf")
plt.scatter(x_3, a, label="三月份")
plt.scatter(x_10,b, label="十月份")

# 調整x軸的刻度
_x = list(x_3) + list(x_10)
_xtick_labels = ["3月{}日".format(i) for i in x_3]
_xtick_labels += ["10月{}日".format(i-50) for i in x_10]
plt.xticks(_x, _xtick_labels, rotation=45, fontproperties=my_font)
plt.yticks(a)
plt.yticks(b)
plt.ylabel("溫度",fontproperties=my_font)
plt.xlabel("月份",fontproperties=my_font)
plt.title("溫度散點圖",fontproperties=my_font)
plt.legend(prop=my_font)
plt.show()

  散點圖的更多應用場景:

    不一樣條件(維度)之間的內在關聯關係

    觀察數據的離散聚合程度

 

四: 繪製條形圖

  1.技術要點: plt.bar(x,y,width)  bar繪製條形圖,只能接受含數字的可迭代對象,width表示長條間距,默認爲0.8

  2.假設你獲取到了2017年內地電影票房前20的電影(列表a)和電影票房數據(列表b),那麼如何更加直觀的展現該數據呢?

  a = ["戰狼2","速度與激情8","功夫瑜伽","西遊伏妖篇","變形金剛5:最後的騎士","摔跤吧!爸爸",

     "加勒比海盜5:死無對證","金剛:骷髏島","極限特工:終極迴歸","生化危機6:終章","乘風破浪","神偷奶爸3",
"智取威虎山","大鬧天竺","金剛狼3:殊死一戰","蜘蛛俠:英雄歸來","悟空傳","銀河護衛隊2","情聖","新木乃伊",]

  b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
  
from matplotlib import pyplot as plt

from matplotlib import font_manager

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf")
a = ["戰狼2","速度與激情8","功夫瑜伽","西遊伏妖篇","變形金剛5:最後的騎士","摔跤吧!爸爸",
     "加勒比海盜5:死無對證","金剛:骷髏島","極限特工:終極迴歸","生化危機6:終章","乘風破浪","神偷奶爸3",
     "智取威虎山","大鬧天竺","金剛狼3:殊死一戰","蜘蛛俠:英雄歸來","悟空傳","銀河護衛隊2","情聖","新木乃伊",]

b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

plt.figure(figsize=(20, 8), dpi=80)
plt.bar(range(len(a)), b, width=0.3)   # width表示長條的寬度,默認爲0.8

plt.xticks(range(len(a)), a, fontproperties=my_font, rotation=45)

plt.xlabel("電影名",fontproperties=my_font)
plt.ylabel("票房(單位:億元)", fontproperties=my_font)


plt.show()

 

  3.繪製橫着的條形圖,plt.barh(x,y,hight)

  

# 繪製橫着的條形圖

from matplotlib import pyplot as plt

from matplotlib import font_manager

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf")
a = ["戰狼2","速度與激情8","功夫瑜伽","西遊伏妖篇","變形金剛5:最後的騎士","摔跤吧!爸爸",
     "加勒比海盜5:死無對證","金剛:骷髏島","極限特工:終極迴歸","生化危機6:終章","乘風破浪","神偷奶爸3",
     "智取威虎山","大鬧天竺","金剛狼3:殊死一戰","蜘蛛俠:英雄歸來","悟空傳","銀河護衛隊2","情聖","新木乃伊",]

b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

plt.figure(figsize=(20, 8), dpi=80)
plt.barh(range(len(a)), b, height=0.3)

plt.yticks(range(len(a)), a, fontproperties=my_font)

plt.ylabel("電影名",fontproperties=my_font)
plt.xlabel("票房(單位:億元)", fontproperties=my_font)

plt.grid(alpha=0.3)
plt.show()

 

  4.繪製多個條形圖

   假設你知道了列表a中電影分別在2017-09-14(b_14),2017-09-15(b_15),2017-09-16(b_16)三天的票房,爲了展現列表中電影自己的 票房以及同其餘電影的數據對比狀況,應該如何更加直觀的呈現該數據?  

a = ["猩球崛起3:終極之戰","敦刻爾克","蜘蛛俠:英雄歸來","戰狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]

# 多個 條形圖

from matplotlib import pyplot as plt

from matplotlib import font_manager

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf")

a = ["猩球崛起3:終極之戰","敦刻爾克","蜘蛛俠:英雄歸來","戰狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]


bar_width = 0.2
x_14 = list(range(len(a)))
x_15 = [i+bar_width for i in x_14]
x_16 = [i+bar_width for i in x_15]

plt.figure(figsize=(20, 8),dpi=80)

plt.bar(x_14, b_14, width=bar_width, label="9月14日")
plt.bar(x_15, b_15, width=bar_width, label="9月15日")
plt.bar(x_16, b_16, width=bar_width, label="9月16日")

plt.xticks(x_15, a, fontproperties=my_font)
plt.legend(prop=my_font)

plt.show()

   5.條形圖更多的應用場景

    數量統計

    頻率統計(市場飽和度)

 

五:繪製直方圖

  1.假設你獲取到了250部電影的時長(列表a),但願統計出這些電影時長的分佈狀態(好比時長爲100分鐘到120分鐘電影的數量,出現的頻率)等信息,你應該如何呈現這些數據? 

a = [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]
 

  

from matplotlib import pyplot as plt
from matplotlib import font_manager

# 原始數據
a = [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]

# 計算組數
d = 3 # 組距
num_bins = (max(a)-min(a)) // d

plt.figure(figsize=(20,8), dpi=80)

# 繪製直方圖 用於原始數據
plt.hist(a, num_bins, density=True) # density 分佈頻率

# 設置x軸的刻度
plt.xticks(range(min(a), max(a)+d, d))

plt.grid(alpha=0.3)
plt.show()
 

  

   2.在美國2004年人口普查發現有124million的人在離家相對較遠的地方工做,更具他們從家到上班地點所須要的時間,經過抽樣統計(最後一列)出下標的數據,這些數據能繪製成直方圖嗎?

  

interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]

from matplotlib import pyplot as plt
from matplotlib import font_manager


plt.figure(figsize=(20, 8), dpi=80)

interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]

plt.bar(range(len(quantity)), quantity, width=1)

# 設置x軸的刻度
_x = [i-0.5 for i in range(len(width)+1)]
_xtick_label = interval + [150]
plt.xticks(_x,_xtick_label)
plt.show()

 

 

  直方圖更多應用場景:
    用戶年齡的分佈狀態
    一段時間內用戶點擊次數的分佈狀態
    用戶活躍時間的分佈狀態
  

相關文章
相關標籤/搜索