1. 程式人生 > 實用技巧 >matplotlib(終章)

matplotlib(終章)

今日內容概要

  • matplotlib實際案例演示
  • 各種圖形的總結
  • 資料清洗(簡單)
  • 資料清洗的案例

今日內容詳細

matplotlib實際案例演示

# 2.繪製每年電影上映數量曲線圖
首先載入模組
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 寫入標題可以是中文的配置(以下是windows下的配置方法)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 從EXCEL檔案中讀取豆瓣電影排行表
ses = pd.read_csv(r'C:\\douban_movie.csv')
ses
執行結果:
名字	投票人數	型別	產地	上映時間	時長	年代	評分	首映地點
0	肖申克的救贖	692795.0	劇情/犯罪	美國	1994-09-10 00:00:00	142.0	1994	9.6	多倫多電影節
1	控方證人	42995.0	劇情/懸疑/犯罪	美國	1957-12-17 00:00:00	116.0	1957	9.5	美國
2	美麗人生	327855.0	劇情/喜劇/愛情	義大利	1997-12-20 00:00:00	116.0	1997	9.5	義大利
3	阿甘正傳	580897.0	劇情/愛情	美國	1994-06-23 00:00:00	142.0	1994	9.4	洛杉磯首映
4	霸王別姬	478523.0	劇情/愛情/同性	中國大陸	1993-01-01 00:00:00	171.0	1993	9.4	香港
...	...	...	...	...	...	...	...	...	...
38730	神學院 S	46.0	Adult	法國	1905-06-05 00:00:00	58.0	1983	8.6	美國
38731	1935年	57.0	喜劇/歌舞	美國	1935-03-15 00:00:00	98.0	1935	7.6	美國
38732	血濺畫屏	95.0	劇情/懸疑/犯罪/武俠/古裝	中國大陸	1905-06-08 00:00:00	91.0	1986	7.1	美國
38733	魔窟中的幻想	51.0	驚悚/恐怖/兒童	中國大陸	1905-06-08 00:00:00	78.0	1986	8.0	美國
38734	列寧格勒圍困之星火戰役 Блокада: Фильм 2: Ленинградский ме...	32.0	劇情/戰爭	蘇聯	1905-05-30 00:00:00	97.0	1977	6.6	美國
38735 rows × 9 columns
安裝年代分組 提供兩種方法
1.方式1:推薦
ses.groupby(['年代']).size().sort_values(ascending=False)
執行結果:
年代
2012     2042
2013     2001
2008     1963
2014     1887
2010     1886
         ... 
1899        2
34943       1
1892        1
1890        1
39180       1
Length: 128, dtype: int64
2.方式2
ses['年代'].value_counts()
執行結果:
2012     2042
2013     2001
2008     1963
2014     1887
2010     1886
         ... 
1888        2
1890        1
34943       1
1892        1
39180       1
Name: 年代, Length: 128, dtype: int64
            
# 這裡我們不應該按照電影數量排序而是應該按照數量對應的年份排序
ses1 = ses.groupby(['年代']).size().sort_index(ascending=False) # ascending引數如果不手動設定為False的話,是升序排序
執行結果:
年代
39180       1
34943       1
2016      257
2015     1592
2014     1887
         ... 
1895        8
1894        3
1892        1
1890        1
1888        2
Length: 128, dtype: int64
  
ses1= ses.groupby(['年代']).size().sort_index(ascending=True) 
ses1
# ascending引數可以選擇為True或者可以為空,結果都是一樣的
執行結果:
年代
1888        2
1890        1
1892        1
1894        3
1895        8
         ... 
2014     1887
2015     1592
2016      257
34943       1
39180       1
Length: 128, dtype: int64

# 切除異常資料(該表的34943年和39180年的資料)
ses= ses1[:-2]
ses
執行結果: # 這樣就將該表的異常資料就切除了
年代
1888       2
1890       1
1892       1
1894       3
1895       8
        ... 
2012    2042
2013    2001
2014    1887
2015    1592
2016     257
Length: 126, dtype: int64
        
  # 確定x軸數值和y軸數值
x = ses.index
x
y = ses.values
y
執行結果:
x:Int64Index([1888, 1890, 1892, 1894, 1895, 1896, 1897, 1898, 1899, 1900,
            ...
            2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016],
           dtype='int64', name='年代', length=126)
y:array([   2,    1,    1,    3,    8,    8,    3,    2,    2,    7,    4,
          6,   16,    8,    5,    7,    5,    6,    5,    5,    4,    5,
          8,   26,   20,   12,   12,   12,   20,   14,   22,   22,   18,
         28,   25,   23,   29,   40,   35,   25,   42,   37,   50,   51,
         46,   60,   50,   38,   49,   39,   47,   53,   57,   54,   49,
         59,   75,   87,   89,   76,   79,   87,   88,  102,  115,  147,
        107,  122,  128,  131,  102,  143,  143,  182,  163,  180,  176,
        172,  207,  190,  219,  207,  213,  223,  196,  233,  220,  201,
        227,  224,  274,  266,  277,  294,  322,  325,  343,  391,  393,
        393,  410,  435,  441,  494,  489,  517,  537,  577,  625,  731,
        828,  900,  951, 1136, 1263, 1515, 1711, 1963, 1862, 1886, 1866,
       2042, 2001, 1887, 1592,  257], dtype=int64)

# 畫出曲線圖
plt.plot(x,y)
plt.show()

# 最後做優化完善填充資訊
plt.figure(figsize=(10,6))
plt.title('年代與電影數量曲線圖',fontsize=30,color='c')
plt.xlabel('年代',fontsize=25,color='m')
plt.ylabel('數量',fontsize=25,color='b')
plt.xticks(fontsize=13,color='m')
plt.yticks(fontsize=13,color='b')
# 根據電影的長度繪製餅圖
bes.head(2)  # 電影的時長根據具體的業務邏輯劃分成不同的等級
bes =  res['時長']
bes
執行結果:
0        142.0
1        116.0
2        116.0
3        142.0
4        171.0
         ...  
38730     58.0
38731     98.0
38732     91.0
38733     78.0
38734     97.0
Name: 時長, Length: 38735, dtype: float64

bes1 = pd.cut(bes,[0,60,70,90,120,140,1100])
# pd.cut(第一個引數帶操作物件,自己放一個列表裡面指定範圍多個區間值)
bes1
執行結果:
0        (140, 1100] # (140,1000] 小括號表示開區間 不包括 中括號表示閉區間 包括
1          (90, 120]
2          (90, 120]
3        (140, 1100]
4        (140, 1100]
            ...     
38730        (0, 60]
38731      (90, 120]
38732      (90, 120]
38733       (70, 90]
38734      (90, 120]
Name: 時長, Length: 38735, dtype: category
Categories (6, interval[int64]): [(0, 60] < (60, 70] < (70, 90] < (90, 120] < (120, 140] < (140, 1100]]

# 統計每個區間的電影數量                                                                           
                                                                             bes2 = bes1.value_counts()  # 對生成的區間做統計計數
bes2             
執行結果:
                                                                               (90, 120]      16578
(0, 60]        10324
(70, 90]        7213
(120, 140]      2718
(140, 1100]     1386
(60, 70]         514
Name: 時長, dtype: int64

# 明確x和y軸資料 畫圖的時候並不是只有座標系才需要x軸和y軸
 x = bes2.index
y = bes2.values
# 先粗略的畫出來看看
# 圖形優化
 plt.title('電影時長分佈',fontsize=25,color='purple')
# 餅狀圖pie會有一個返回值 在早期的版本里面是三個元素 現在只有兩個元素
 l_text,p_text = plt.pie(y,labels=x)  # 利用python解壓複製的操作
# l_text和p_text都是列表 前者用於修改x軸標題 後者用於修改區域文字
 for i in l_text:
    # i 對應就是各個區域
    # i.set_color('yellowgreen')
     pass
for j in p_text:
    # j 對應就是各個文字
    # j.set_color('sage') # 設定文字顏色
    # j.set_text('hahaha') # 設定文字內容
  j.set_size(15) # 設定文字大小
plt.show()    

各種圖形的總結

plot   折線圖
pie    餅圖
bar    統計圖

# DataFrame陣列圖
cf = pd.DataFrame({
    'Jan':pd.Series([1,2,3],index=['a','b','c']),
    'Fed':pd.Series([4,5,6],index=['b','a','c']),
    'Mar':pd.Series([7,8,9],index=['b','a','c']),
    'Apr':pd.Series([2,4,6],index=['b','a','c'])
})
cf.plot.bar() # 水平柱狀圖,將每一行中的值分組到並排的柱子中的一組
cf.plot.barh(stacked=True,alpha=0.5) # 橫向柱狀圖,將每一行的值堆積到一起
 

總結

後續更加複雜的圖形化展示可以使用
highcharts
      中規中矩
echarts
      echarts是基於highchairts開發的,有點過於花裡胡哨