Python數據可視化
1.Python 是一門富有表達力的語言,很適合用於數據分析。
2.Python有很多數據可視化的package,主要分為探索性分析方向的(Matplotlib,Seaborn)和交互性信息可視化(Bokeh,Plotly),後者主要用於與業務結合過程中展現總體分析結果的。
3.Python有很多非常優秀易用的數據可視化的庫,作為入門在這裡使用Python的matplotlib,事實上Python中很多可視化庫都是基於matplotlib開發的,例如Seaborn等。
Matplotlib可視化
1.Matplotlib是Python中最常用的可視化工具之一,可以非常方便地創建海量類型地2D圖表和一些基本的3D圖表,可根據數據集(DataFrame,Series)自行定義x,y軸,繪製圖形(線形圖,柱狀圖,直方圖,密度圖,散布圖等等),能夠解決大部分的需要。
2.Matplotlib最早是為了可視化癲癇病人的腦皮層電圖相關的信號而研發,因為在函數的設計上參考了MATLAB,所以叫做Matplotlib。
3.官方文檔:https://matplotlib.org/
4.Matplotlib中最基礎的模塊是pyplot。
基本繪圖流程
1.創建畫布與創建子圖
第一部分主要作用是構建出一張空白的畫布,並可以選擇是否將整個畫布劃分為多個部分,方便在同一幅圖上繪製多個圖形的情況。最簡單的繪圖可以省略第一部分,而後直接在默認的畫布上進行圖形繪製。
函數名稱
函數作用
plt.figure
創建一個空白畫布,可以指定畫布大小,像素。
figure.add_subplot
創建並選中子圖,可以指定子圖的行數,列數,與選中圖片編號。
函數名稱
函數作用
plt.title
在當前圖形中添加標題,可以指定標題的名稱、位置、
顏色、字體大小等參數。
plt.xlabel
在當前圖形中添加x軸名稱,可以指定位置、顏色、
字體大小等參數。
plt.ylabel
在當前圖形中添加y軸名稱,可以指定位置、顏色、字體大小等參數。
plt.xlim
指定當前圖形x軸的範圍,只能確定一個數值區間,而無法使用字符串標識。
plt.ylim
指定當前圖形y軸的範圍,只能確定一個數值區間,而無法使用字符串標識。
plt.xticks
指定x軸刻度的數目與取值。
plt.yticks
指定y軸刻度的數目與取值。
plt.legend
指定當前圖形的圖例,可以指定圖例的大小、位置、標籤。
2.添加畫布內容
第二部分是繪圖的主體部分。其中添加標題,坐標軸名稱,繪製圖形等步驟是並列的,沒有先後順序,可以先繪製圖形,也可以先添加各類標籤。但是添加圖例一定要在繪製圖形之後。
如下圖參數說明
3.保存與展示圖形
第三部分主要用於保存和顯示圖形。
函數名稱
函數作用
plt.savafig
保存繪製的圖片,可以指定圖片的解析度、邊緣的顏色等參數。
plt.show
在本機顯示圖形。
plt.rcParams屬性總結知識點:
plt(matplotlib.pyplot)使用rc配置文件來自定義圖形的各種默認屬性,稱之為rc配置或rc參數。屬性
說明
1
plt.rcParams[』axes.unicode_minus』] = False
字符顯示
2
plt.rcParams[』font.sans-serif』] = 『SimHei』
設置字體
線條樣式
1
plt.rcParams[』lines.linestyle』] = 『-.』
線條樣式
2
plt.rcParams[』lines.linewidth』] = 3
線條寬度
3
plt.rcParams[』lines.color』] = 『blue』
線條顏色
4
plt.rcParams[』lines.marker』] = None
默認標記
5
plt.rcParams[』lines.markersize』] = 6
標記大小
6
plt.rcParams[』lines.markeredgewidth』] = 0.5
標記附近的線寬
橫、縱軸:xtick、ytick
1
plt.rcParams[』xtick.labelsize』]
橫軸字體大小
2
plt.rcParams[』ytick.labelsize』]
縱軸字體大小
3
plt.rcParams[』xtick.major.size』]
x軸最大刻度
4
plt.rcParams[』ytick.major.size』]
y軸最大刻度
figure中的子圖:axes
1
plt.rcParams[』axes.titlesize』]
子圖的標題大小
2
plt.rcParams[』axes.labelsize』]
子圖的標籤大小
圖像、圖片:figure、savefig
1
plt.rcParams[』figure.dpi』]
圖像解析度
2
plt.rcParams[』figure.figsize』]
圖像顯示大小
3
plt.rcParams[’savefig.dpi』]
圖片像素
案例:
學生人數分布圖
二級
學院
A學院
B學院
C學院
D學院
E學院
F學院
人數
2000
1500
1300
1678
2560
4780
運行
運行結果1:
參考代碼:
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'kaiti'
plt.rcParams['font.size'] = 15
x = ['A學院', 'B學院','C學院','D學院','E學院','F學院']
y=[2000,1500,1300,1678,2560,4780]
plt.bar(x,y)
plt.title('二級學院人數分布圖')
plt.xlabel('二級學院')
plt.ylabel('各二級學院人數')
plt.show()
運行結果2:
參考代碼:
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'kaiti'
plt.rcParams['font.size'] = 15
x = ['A學院', 'B學院','C學院','D學院','E學院','F學院']
y=[2000,1500,1300,1678,2560,4780]
plt.plot(x,y)
plt.title('二級學院人數分布圖')
plt.xlabel('二級學院')
plt.ylabel('各二級學院人數')
plt.show()
運行結果3:
參考代碼:
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'kaiti'
plt.rcParams['font.size'] = 15
x = ['A學院', 'B學院','C學院','D學院','E學院','F學院']
y=[2000,1500,1300,1678,2560,4780]
plt.plot(x,y,marker='*')
plt.title('二級學院人數分布圖')
plt.xlabel('二級學院')
plt.ylabel('各二級學院人數')
plt.show()
案例:
hist知識點
運行結果:
參考代碼:
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'kaiti'
plt.rcParams['font.size'] = 15
x = [0,2,9,2,5,8,7,3,1,9,4,3,5,8,10,0,12,9,5,10]
plt.hist(x)
plt.show()
案例:
pie知識點:
pie函數的語法和參數含義如下:
pie(x, explode=None, labels=None, colors=None,
autopct=None, pctdistance=0.6, shadow=False,
labeldistance=1.1, startangle=None,
radius=None, counterclock=True, wedgeprops=None,
textprops=None, center=(0, 0), frame=False)
知識點講解:
x:指定繪圖的數據。
explode:指定餅圖某些部分的突出顯示,即呈現爆炸式。
labels:為餅圖添加標籤說明,類似於圖例說明。
colors:指定餅圖的填充色。
autopct:自動添加百分比顯示,可以採用格式化的方法顯示。
pctdistance:設置百分比標籤與圓心的距離。
shadow:是否添加餅圖的陰影效果。
labeldistance:設置各扇形標籤(圖例)與圓心的距離。
startangle:設置餅圖的初始擺放角度。radius:設置餅圖的半徑大小。
counterclock:是否讓餅圖按逆時針順序呈現。
wedgeprops:設置餅圖內外邊界的屬性,如邊界線的粗細、顏色等。
textprops:設置餅圖中文本的屬性,如字體大小、顏色等。
center:指定餅圖的中心點位置,默認為原點。
frame:是否要顯示餅圖背後的圖框,如果設置為True的話,需要同時控制圖框x軸、y軸的範圍和餅圖的中心位置。
運行結果:
參考代碼:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #顯示中文標籤,處理中文亂碼問題
plt.rcParams['axes.unicode_minus']=False #坐標軸負號的處理
plt.axes(aspect='equal') #將橫、縱坐標軸標準化處理,確保餅圖是一個正圓,否則為橢圓
#構造數據
edu = [0.2515, 0.3724, 0.3336, 0.0368, 0.0057]
labels = ['中專','大專','本科','碩士','其他']
explode = [0, 0.1, 0, 0, 0] #生成數據,用於凸顯大專學歷人群
colors = ['#9999ff', '#ff9999', '#7777aa', '#2442aa', '#dd5555'] #自定義顏色
plt.pie(x=edu, #繪圖數據
explode=explode, #指定餅圖某些部分的突出顯示,即呈現爆炸式
labels=labels, #添加教育水平標籤
colors=colors,
autopct='%.2f%%', #設置百分比的格式,這裡保留兩位小數
pctdistance=0.8, #設置百分比標籤與圓心的距離
labeldistance=1.1, #設置教育水平標籤與圓心的距離
startangle=180, #設置餅圖的初始角度
radius=1.2, #設置餅圖的半徑
counterclock=False, #是否逆時針,這裡設置為順時針方向
wedgeprops={'linewidth':1.5, 'edgecolor':'green'}, #設置餅圖內外邊界的屬性值
textprops={'fontsize':10, 'color':'black'}, #設置文本標籤的屬性值
)
#添加圖標題
plt.title('失信用戶的受教育水平分布')
#顯示圖形
plt.show()
案例:
Matplotlib
散點圖: plt.scatter()
• import numpy as np
• import matplotlib.pyplot as plt
• x = np.linspace(0, 2*np.pi, 100)
• y = np.sin(x) + np.random.random(len(x))
• plt.scatter(x, y)
• plt.show()
折線圖: plt.plot()
• x = np.linspace(0, 2*math.pi, 100)
• y = np.sin(x) + np.random.random(len(x))
• plt.scatter(x, y)
• plt.plot(x, y, 'r')
• plt.plot(x, np.sin(x)+0.5, 'g')
• plt.show()
Ø import matplotlib.pyplot as plt
Ø plt.plot([1, 2, 3, 4])
Ø plt.ylabel('some numbers')
Ø plt.show()
Ø 如果為plot()命令提供單個列表或數組 ,matplotlib假定它是一系列y值,並自動為您生成x值。由於python範圍以0開頭,因此默認的x向量與y的長度相同,但以0開頭。因此x數據為 [0,1,2,3]。
柱狀圖: plt.bar()
• n = 12; x = np.arange(n)
• np.random.seed(123)
• y1 = np.random.random(n)
• y2 = np.random.random(n)
• plt.bar(x, y1, facecolor='#FFF68F')
• plt.bar(x, -y2, facecolor='#9999ff')
• for i, j in zip(x, y1):
• plt.text(i, j+0.05, '%.2f'%j, ha='center', va='bottom')
• for i, j in zip(x, y2):
• plt.text(i, -j-0.05, '%.2f'%j, ha='center', va='top')
• plt.ylim(-1.2, 1.2)
• plt.show()
注釋:
Ø text()上面基本命令的使用將文本放在Axes上的任意位置。文本的常見用途是注釋繪圖的某些功能,並且該 annotate()方法提供幫助功能以使注釋變得容易。在注釋中,有兩點需要考慮:注釋的位置由參數xy和文本的位置表示xytext。這兩個參數都是(x,y)元組。
Ø xy(箭頭提示)和xytext 位置(文本位置)都在數據坐標中
Ø matplotlib在任何文本表達式中接受TeX方程表達式。編寫一個由美元符號包圍的TeX表達式。
Ø plt.title(r'$\sigma_i=15$')
餅圖: plt.pie()
• n = 20
• z = np.ones(n)
• plt.figure(figsize=(5, 5))
• plt.pie(z, explode=[0.1]*(n-1)+[0.3], colors=['%f'%(i/n) for i in range(n)])
• plt.show()
以某餐飲企業的訂單詳情表數據為可視化對象
以某餐飲企業的訂單詳情表數據為可視化對象,分析以下內容:
Ø 銷售額隨時間的變化情況
Ø 銷售額與星期的關係
Ø 訂單數量與銷售額的關係
Ø 其中:
• dishes_name:菜品名稱
• counts:菜品數量
• amounts:菜品單價
• order_id:訂單號
• place_order_time:下單時間
案例代碼:
data.columns
ind=pd.DatetimeIndex(data['place_order_time'])
data['weekday_name']=ind.weekday_name
data['day']=pd.DatetimeIndex(data['place_order.time']).day
銷售額隨時間的變化情況
Ø 查看核心指標近期情況可以使用折線圖反映數據走勢,散點圖反映數據分布。
銷售額與星期的關係
Ø 從上面的折線圖可以看出明顯的周期性,所以對星期的銷售額情況做分析。
Ø 時間、訂單量、銷售額之間的關係分析
二、Pyecharts可視化
介紹
Ø Echarts 是一個由百度開源的數據可視化,憑藉著良好的交互性,精巧的圖表設計,得到了眾多開發者的認可。而 Python 是一門富有表達力的語言,很適合用於數據處理。當數據分析遇上數據可視化時,pyecharts 誕生了。
Ø pyecharts 分為 v0.5.X 和 v1 兩個大版本,v0.5.X 和 v1 間不兼容,v1 是一個全新的版本。(使用版本為v1)
Ø 官網:https://www.echartsjs.com/index.html
Ø Pyecharts官網:https://pyecharts.org/#/zh-cn/intro
Ø 安裝:pip install pyecharts
繪圖邏輯:
Ø 選擇圖表類型
Ø 添加數據
Ø 設置全局變量
Ø 顯示及保存圖表
函數
說明
函數
說明
Scatter
散點圖
Funnel
漏鬥圖
Bar
柱狀圖
Gauge
儀錶盤
Pie
餅圖
Graph
關係圖
Line
折線/面積圖
Liquid
水球圖
Radar
雷達圖
Parallel
平行坐標系
Sankey
桑基圖
Polar
極坐標系
WordCloud
詞雲圖
HeatMap
熱力圖
添加數據
散點圖、折線圖等二維數據圖形可通過 .add_xaxis(xaxis_data=x)和.add_yaxis(series_name='', y_axis=y)方法設置
餅圖等一維圖形可通過.add(series_name=『』, data_pair=[(i, j)for i, j in zip(lab, num)])方法設置參數
pyecharts 所有方法均支持鏈式調用。
顯示、保存圖表
.get_options() # 該行只為了查看配置項,方便調試時使用
.render():默認將會在當前目錄下生成一個 render.html 的文件,支持 path 參數,設置文件保存位置,如 render(r"e:\my_first_chart.html"),文件用瀏覽器打開。
.Jupyter Notebook() 直接調用 render_notebook ()隨時隨地渲染圖表
a) 散點圖
Ø x = np.linspace(0, 10, 50)
Ø y = np.sin(x)
Ø point = (Scatter(init_opts=opts.InitOpts(width="720px", height="320px"))
Ø .add_xaxis(xaxis_data=x)
Ø .add_yaxis(series_name='', y_axis=y)
Ø point.render_notebook()
b) 折線圖
Ø line = (Line(init_opts=opts.InitOpts(width="720px", height="320px"))
Ø .add_xaxis(xaxis_data=x)
Ø .add_yaxis(series_name='', y_axis=y, label_opts=opts.LabelOpts(is_show=False)) # 是否顯示散點對應的數據(默認顯示)
Ø )
Ø line.render_notebook()
c) 餅圖
Ø num = [110, 136, 108, 48, 111, 112, 103]
Ø lab = ['哈士奇', '薩摩耶', '泰迪', '金毛', '牧羊犬', '吉娃娃', '柯基']
Ø pie = (Pie(init_opts=opts.InitOpts(width='720px', height='320px'))
Ø .add(series_name='', data_pair=[(i, j)for i, j in zip(lab, num)]))
Ø pie.render_notebook()
d) 柱狀圖
Ø num = [110, 136, 108, 48, 111, 112, 103]
Ø num2 = [90, 110, 101, 70, 90, 120, 99]
Ø lab = ['哈士奇', '薩摩耶', '泰迪', '金毛', '牧羊犬', '吉娃娃', '柯基']
Ø bar = (Bar(init_opts=opts.InitOpts(width='720px', height='320px'))
Ø .add_xaxis(xaxis_data=lab)
Ø .add_yaxis(series_name='商家A', yaxis_data=num)
Ø .add_yaxis(series_name='商家B', yaxis_data=num2))
Ø bar.render_notebook()
e) 全局配置組件:定製圖表
Ø 使用 options 配置項,在 pyecharts 中,一切皆 Options。
Ø 比如,添加標題:
Ø .set_global_opts(title_opts=opts.TitleOpts(, sub))
f) Grid:並行多圖
上下布局:
Ø grid = ( Grid()
Ø .add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
Ø .add(line, grid_opts=opts.GridOpts(pos_top="60%")) )
左右布局:
Ø grid = (Grid()
Ø .add(scatter, grid_opts=opts.GridOpts(pos_left="55%"))
Ø .add(line, grid_opts=opts.GridOpts(pos_right="55%")) )
Ø bar.overlap(line)
Ø bar.render_notebook()
三.Pyecharts地理圖表
有時我們會很希望把數據展示在地圖上,來做數據可視化,使數據更加清晰明了。
Ø 比如:微信好友全國分布,顯示票房省份數據,全國評分顯示
例子:百度遷徙
Ø 百度地圖春節人口遷徙大數據(簡稱百度遷徙),是百度在2014年春運期間推出的一項技術項目。百度遷徙利用大數據,對其擁有的LBS(基於地理位置的服務)大數據進行計算分析,採用的可視化呈現方式,動態、即時、直觀地展現中國春節前後人口大遷徙的軌跡與特徵。
Ø http://qianxi.baidu.com/
Ø from pyecharts.charts import Geo
Ø Geo() # Pyecharts地理圖表繪製
Ø # 地圖模式設置
Ø .add_schema(
Ø maptype=「china「 # 地圖類型
Ø )
Ø .add() # 添加數據
Ø .set_global_opts() # 設置全局配置項
中國地圖
特效散點圖
特效散點圖:添加箭頭
熱力圖
熱力圖:廣東地圖的熱力圖
廣東地圖的地域圖
例子:分析微信好友性別、地區分布