matplotlib(終章)
阿新 • • 發佈:2020-09-09
今日內容概要
- 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開發的,有點過於花裡胡哨