Python數(shù)據(jù)可視化詳解
數(shù)據(jù)可視化是一種將龐雜抽象的數(shù)據(jù)轉(zhuǎn)化為直觀易懂的圖形的數(shù)據(jù)呈現(xiàn)技術,它能幫助我們快速把握數(shù)據(jù)的分布和規(guī)律,更加輕松地理解和探索信息。在當今這個信息爆炸的時代,數(shù)據(jù)可視化越來越受重視。
一、Matplotlib模塊
Matplotlib是Python中最常用、最著名的數(shù)據(jù)可視化模塊,該模塊的子模塊pyplot包含大量用于繪制各類圖表的函數(shù)。
1、繪制基本圖表
日常工作中最基本的圖表有柱形圖、條形圖、折線圖、餅圖等,Matplotlib模塊針對這些圖表均提供了對應的繪制函數(shù)。用于繪制圖表的數(shù)據(jù)可以直接使用提供的代碼,也可以通過pandas模塊的read_excel()函數(shù)從Excel工作簿中導入。
1. 繪制柱形圖
代碼文件:繪制柱形圖.py
柱形圖通常用于直觀地對比數(shù)據(jù),在實際工作中使用頻率很高。使用Matplotlib模塊中的bar()函數(shù)即可繪制柱形圖。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 x = [1, 2, 3, 4, 5, 6, 7, 8] 3 y = [60, 45, 49, 36, 42, 67, 40, 50] 4 plt.bar(x, y) 5 plt.show()
第1行代碼導入Matplotlib模塊的子模塊pyplot,第2行和第3行代碼分別給出圖表的x軸和y軸的值,第4行代碼使用bar()函數(shù)繪制柱形圖,第5行代碼使用show()函數(shù)顯示繪制的圖表。
代碼運行結果如下圖所示:
如果想要改變柱形圖中每根柱子的寬度和顏色,可以通過設置bar()函數(shù)的參數(shù)width和color的值來實現(xiàn)。
演示代碼如下:
1 plt.bar(x, y, width=0.5, color='r')
參數(shù)width用于設置柱子的寬度,其值并不表示一個具體的尺寸,而是表示柱子的寬度在圖表中所占的比例,默認值為0.8。如果設置為1,則各個柱子會緊密相連;如果設置為大于1的數(shù),則各個柱子會相互交疊。
參數(shù)color用于設置柱子的填充顏色,上述代碼中的“r”是“red”的簡寫,表示將柱子的填充顏色設置為紅色。Matplotlib模塊支持多種格式定義的顏色,常用的格式有以下幾種:
- 用顏色名的英文單詞或其簡寫定義的8種基礎顏色,具體見下表;
- 用RGB值的浮點數(shù)元組定義的顏色,RGB值通常是用0~255的十進制整數(shù)表示的,如(51, 255, 0),將每個元素除以255,得到(0.2, 1.0, 0.0),就是Matplotlib模塊可以識別的RGB顏色;
- 用RGB值的十六進制字符串定義的顏色,如'#33FF00',其與(51, 255, 0)是相同的RGB顏色,可自行搜索“十六進制顏色碼轉(zhuǎn)換工具”來獲取更多顏色。
在上面的代碼中,x軸和y軸的值都是數(shù)字,如果值中有中文字符,則必須在繪制圖表前加上兩行代碼。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 3 plt.rcParams['axes.unicode_minus'] = False 4 x = ['上海', '成都', '重慶', '深圳', '北京', '長沙', '南京', '青島'] 5 y = [60, 45, 49, 36, 42, 67, 40, 50] 6 plt.bar(x, y, width=0.5, color='r') 7 plt.show()
第4行代碼給出的x軸的值為中文字符串,而Matplotlib模塊在繪制圖表時默認不支持顯示中文,因此必須加上第2行和第3行代碼。其中,第2行代碼通過設置字體為微軟雅黑來正常顯示中文內(nèi)容,第3行代碼用于解決負號顯示為方塊的問題。
第2行代碼中的“Microsoft YaHei”是微軟雅黑字體的英文名稱,如果想使用其他中文字體,可參考下面的字體名稱中英文對照表。
代碼運行結果如下圖所示:
2. 繪制條形圖
代碼文件:繪制條形圖.py
條形圖也常用于對比數(shù)據(jù),它可以看成將柱形圖的x軸和y軸調(diào)換位置的結果。使用Matplotlib模塊中的barh()函數(shù)可繪制條形圖。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 3 plt.rcParams['axes.unicode_minus'] = False 4 x = ['上海', '成都', '重慶', '深圳', '北京', '長沙', '南京', '青島'] 5 y = [60, 45, 49, 36, 42, 67, 40, 50] 6 plt.barh(x, y, height=0.5, color='r') # 參數(shù)height用于設置條形的高度 7 plt.show()
代碼運行結果如下圖所示:
3. 繪制折線圖
代碼文件:繪制折線圖.py
折線圖常用于顯示一段時間內(nèi)的數(shù)據(jù)趨勢。使用Matplotlib模塊中的plot()函數(shù)可繪制折線圖。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 3 plt.rcParams['axes.unicode_minus'] = False 4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] 5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90] 6 plt.plot(x, y, color='r', linewidth=2, linestyle='dashdot') 7 plt.show()
第6行代碼中,參數(shù)color用于設置折線的顏色;參數(shù)linewidth用于設置折線的粗細(單位為“點”);參數(shù)linestyle用于設置折線的線型,可取的值如下表所示。
代碼運行結果如下圖所示:
通過設置參數(shù)marker和markersize可繪制帶數(shù)據(jù)標記的折線圖。
演示代碼如下:
1 plt.plot(x, y, color='r', linestyle='dashdot', linewidth=2, marker='*', markersize=10)
代碼中的marker= '*'表示設置數(shù)據(jù)標記的樣式為五角星,markersize=10表示設置數(shù)據(jù)標記的大小為10點。
參數(shù)marker常用的取值如下表所示:
代碼運行結果如下圖所示:
4. 繪制面積圖
代碼文件:繪制面積圖.py
面積圖實際上是折線圖的另一種表現(xiàn)形式,它利用折線與坐標軸圍成的圖形來表達數(shù)據(jù)隨時間推移的變化趨勢。使用Matplotlib模塊中的stackplot()函數(shù)可繪制面積圖。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 3 plt.rcParams['axes.unicode_minus'] = False 4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] 5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90] 6 plt.stackplot(x, y, color='r') 7 plt.show()
代碼運行結果如下圖所示:
5. 繪制散點圖
代碼文件:繪制散點圖.py
散點圖常用于發(fā)現(xiàn)各變量之間的關系。使用Matplotlib模塊中的scatter()函數(shù)可繪制散點圖。演示代碼如下:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 data = pd.read_excel('汽車速度和剎車距離表.xlsx') 4 x = data['汽車速度(km/h)'] 5 y = data['剎車距離(m)'] 6 plt.scatter(x, y, s=100, marker='o', color='r', edgecolor='k') 7 plt.show()
第3行代碼使用read_excel()函數(shù)導入工作簿“汽車速度和剎車距離表.xlsx”中的數(shù)據(jù),第4行指定x軸的值為工作簿中“汽車速度(km/h)”列的數(shù)據(jù),第5行代碼指定y軸的值為工作簿中“剎車距離(m)”列的數(shù)據(jù)。
第6行代碼中,參數(shù)s用于設置每個點的面積;參數(shù)marker用于設置每個點的樣式,取值和plot()函數(shù)的參數(shù)marker相同;參數(shù)color和edgecolor分別用于設置每個點的填充顏色和輪廓顏色。
代碼運行結果如下圖所示:
為便于推斷變量之間的相關性,可為散點圖添加一條線性趨勢線。
演示代碼如下:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 from sklearn import linear_model 4 data = pd.read_excel('汽車速度和剎車距離表.xlsx') 5 x = data['汽車速度(km/h)'] 6 y = data['剎車距離(m)'] 7 plt.scatter(x, y, s=100, marker='o', color='r', edgecolor='k') 8 model = linear_model.LinearRegression().fit(x.values.reshape(-1, 1), y) 9 pred = model.predict(x.values.reshape(-1, 1)) 10 plt.plot(x, pred, color='k', linewidth=3, linestyle='solid') 11 plt.show()
第3行代碼導入Scikit-Learn模塊;第8行和第9行代碼使用Scikit-Learn模塊中的函數(shù)創(chuàng)建了一個線性回歸算法模型,用于根據(jù)汽車速度預測對應的剎車距離;第10行代碼根據(jù)預測結果使用plot()函數(shù)繪制了一條線性趨勢線。
代碼運行結果如下圖所示:
6. 繪制餅圖和圓環(huán)圖
代碼文件:繪制餅圖和圓環(huán)圖.py
餅圖常用于展示各類別數(shù)據(jù)的占比。使用Matplotlib模塊中的pie()函數(shù)可繪制餅圖。演示代碼如下:
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 3 plt.rcParams['axes.unicode_minus'] = False 4 x = ['上海', '成都', '重慶', '深圳', '北京', '青島', '南京'] 5 y = [10, 45, 25, 36, 45, 56, 78] 6 plt.pie(y, labels=x, labeldistance=1.1, autopct='%.2f%%', pctdistance=1.5) 7 plt.show()
第6行代碼中,參數(shù)labels用于設置每一個餅圖塊的標簽,參數(shù)labeldistance用于設置每一個餅圖塊的標簽與中心的距離,參數(shù)autopct用于設置百分比數(shù)值的格式,參數(shù)pctdistance用于設置百分比數(shù)值與中心的距離。
代碼運行結果如下圖所示:
適當設置參數(shù)explode的值,可以分離餅圖塊以突出顯示數(shù)據(jù)。
演示代碼如下:
1 plt.pie(y, labels=x, labeldistance=1.1, autopct='%.2f%%', pctdistance=1.5, explode=[0, 0, 0, 0, 0, 0.3, 0], startangle=90, counterclock=False)
代碼中的參數(shù)explode用于設置每一個餅圖塊與圓心的距離,其值通常是一個列表,列表的元素個數(shù)與餅圖塊的數(shù)量相同。這里設置為[0, 0, 0, 0, 0, 0.3, 0],第6個元素為0.3,其他元素均為0,表示將第6個餅圖塊(青島)分離,其他餅圖塊的位置不變。
參數(shù)startangle用于設置第1個餅圖塊的初始角度,這里設置為90°。
參數(shù)counterclock用于設置各個餅圖塊是逆時針排列還是順時針排列,為False時表示順時針排列,為True時表示逆時針排列。
代碼運行結果如下圖所示:
適當設置參數(shù)wedgeprops的值,還能繪制出圓環(huán)圖。
演示代碼如下:
1 plt.pie(y, labels=x, labeldistance=1.1, autopct='%.2f%%', pctdistance=1.5, wedgeprops={'width': 0.3, 'linewidth': 2, 'edgecolor': 'white'})
參數(shù)wedgeprops用于設置餅圖塊的屬性,其值為一個字典,字典中的元素則是餅圖塊各個屬性的名稱和值的鍵值對。上述代碼中的wedgeprops={'width': 0.3, 'linewidth': 2, 'edgecolor': 'white'}就表示設置餅圖塊的環(huán)寬(圓環(huán)的外圓半徑減去內(nèi)圓半徑)占外圓半徑的比例為0.3,邊框粗細為2,邊框顏色為白色。將餅圖塊的環(huán)寬占比設置為小于1的數(shù)(這里為0.3),就能繪制出圓環(huán)圖的效果。
代碼運行結果如下圖所示:
2、圖表的繪制和美化技巧
主要介紹一些圖表的繪制和美化技巧,包括在一張畫布中繪制多個圖表,以及為了讓圖表更美觀、更易于理解,為圖表添加圖表標題、圖例、網(wǎng)格線等元素,并設置元素的格式,如網(wǎng)格線的線型和粗細、坐標軸的刻度范圍等。
1. 在一張畫布中繪制多個圖表
代碼文件:在一張畫布中繪制多個圖表.py
Matplotlib模塊在繪制圖表時,默認先建立一張畫布,然后在畫布中顯示繪制的圖表。如果想要在一張畫布中繪制多個圖表,可以使用subplot()函數(shù)將畫布劃分為幾個區(qū)域,然后在各個區(qū)域中分別繪制不同的圖表。
subplot()函數(shù)的參數(shù)為3個整型數(shù)字:第1個數(shù)字代表將整張畫布劃分為幾行;第2個數(shù)字代表將整張畫布劃分為幾列;第3個數(shù)字代表要在第幾個區(qū)域中繪制圖表,區(qū)域的編號規(guī)則是按照從左到右、從上到下的順序,從1開始編號。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 3 plt.rcParams['axes.unicode_minus'] = False 4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] 5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90] 6 plt.subplot(2, 2, 1) 7 plt.pie(y, labels=x, labeldistance=1.1, startangle=90, counterclock=False) 8 plt.subplot(2, 2, 2) 9 plt.bar(x, y, width=0.5, color='r') 10 plt.subplot(2, 2, 3) 11 plt.stackplot(x, y, color='r') 12 plt.subplot(2, 2, 4) 13 plt.plot(x, y, color='r', linestyle='solid', linewidth=2, marker='o', markersize=10) 14 plt.show()
第6行代碼將整張畫布劃分為2行2列,并指定在第1個區(qū)域中繪制圖表。接著用第7行代碼繪制餅圖。
第8行代碼將整張畫布劃分為2行2列,并指定在第2個區(qū)域中繪制圖表。接著用第9行代碼繪制柱形圖。
第10行代碼將整張畫布劃分為2行2列,并指定在第3個區(qū)域中繪制圖表。接著用第11行代碼繪制面積圖。
第12行代碼將整張畫布劃分為2行2列,并指定在第4個區(qū)域中繪制圖表。接著用第13行代碼繪制折線圖。
subplot()函數(shù)的參數(shù)也可以寫成一個3位數(shù)的整型數(shù)字,如223。使用這種形式的參數(shù)時,劃分畫布的行數(shù)或列數(shù)不能超過10。
代碼運行結果如下圖所示:
2. 添加圖表元素
代碼文件:添加圖表元素.py
下面來講解如何為圖表添加圖表標題、坐標軸標題、圖例、數(shù)據(jù)標簽等圖表元素。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 3 plt.rcParams['axes.unicode_minus'] = False 4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] 5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90] 6 plt.bar(x, y, width=0.6, color='r', label='銷售額(萬元)') 7 plt.title(label='銷售額對比圖', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 30}, loc='center') 8 plt.xlabel('月份', fontdict={'family': 'SimSun', 'color': 'k', 'size': 20}, labelpad=20) 9 plt.ylabel('銷售額', fontdict={'family': 'SimSun', 'color': 'k', 'size': 20}, labelpad=20) 10 plt.legend(loc='upper left', fontsize=15) 11 for a, b in zip(x, y): 12 plt.text(x=a, y=b, s=b, ha='center', va='bottom', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 20}) 13 plt.show()
第7行代碼中的title()函數(shù)用于添加圖表標題。參數(shù)fontdict用于設置圖表標題的文本格式,如字體、顏色、字號等;參數(shù)loc用于設置圖表標題的位置,可取的值如下表所示。
第8行代碼中的xlabel()函數(shù)用于添加x軸標題,第9行代碼中的ylabel()函數(shù)用于添加y軸標題。這兩個函數(shù)的第1個參數(shù)為標題的文本內(nèi)容,參數(shù)fontdict用于設置標題的文本格式,參數(shù)labelpad用于設置標題與坐標軸的距離。
第10行代碼中的legend()函數(shù)用于添加圖例,圖例的內(nèi)容由相應的繪圖函數(shù)決定。例如,第6行代碼使用bar()函數(shù)繪制柱形圖,則legend()函數(shù)添加的圖例圖形為矩形色塊,圖例標簽文本為bar()函數(shù)的參數(shù)label的值。legend()函數(shù)的參數(shù)loc用于設置圖例的位置,取值可以為字符串或整型數(shù)字,具體如下表所示。
需要注意的是,'right'的含義實際上與'center right'的含義相同,這個值是為了兼容舊版本的Matplotlib模塊而設立的。
第12行代碼中的text()函數(shù)的功能是在圖表坐標系的指定位置添加文本。參數(shù)x和y分別表示文本的x坐標和y坐標;參數(shù)s表示文本的內(nèi)容;參數(shù)ha是horizontal alignment的簡稱,表示文本在水平方向的顯示位置,有'center'、'right'、'left'三個值可選;參數(shù)va是vertical alignment的簡稱,表示文本在垂直方向的顯示位置,有'center'、'top'、'bottom'、'baseline'、'center_baseline'五個值可選。
參數(shù)ha和va取不同值時的繪制效果如下圖所示(上方為參數(shù)ha的效果示意,下方為參數(shù)va的效果示意),限于篇幅,這里不做展開講解,大家簡單了解即可。
text()函數(shù)每次只能添加一個文本,要給圖表的所有數(shù)據(jù)點添加數(shù)據(jù)標簽,則需配合使用循環(huán)。第11行代碼使用for語句構造了一個循環(huán),其中的zip()函數(shù)用于將列表x和y的元素逐個配對打包成一個個元組,即類似('1月', 50)、('2月', 45)、('3月', 65)……的形式,再通過循環(huán)變量a和b分別取出每個元組的元素,在第12代碼中傳遞給text()函數(shù),用于添加數(shù)據(jù)標簽。
代碼運行結果如下圖所示:
3. 添加并設置網(wǎng)格線
代碼文件:添加并設置網(wǎng)格線.py
使用Matplotlib模塊中的grid()函數(shù)可以為圖表添加網(wǎng)格線。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 3 plt.rcParams['axes.unicode_minus'] = False 4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] 5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90] 6 plt.plot(x, y, color='r', linestyle='solid', linewidth=2) 7 plt.title(label='銷售額趨勢圖', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 30}, loc='center') 8 plt.xlabel('月份', fontdict={'family': 'SimSun', 'color': 'k', 'size': 20}, labelpad= 20) 9 plt.ylabel('銷售額(萬元)', fontdict={'family': 'SimSun', 'color': 'k', 'size': 20}, labelpad=20) 10 plt.grid(b=True, color='r', linestyle='dotted', linewidth=1) 11 plt.show()
第10行代碼中,grid()函數(shù)的參數(shù)b設置為True,表示顯示網(wǎng)格線(默認同時顯示x軸和y軸的網(wǎng)格線),參數(shù)linestyle和linewidth分別用于設置網(wǎng)格線的線型和粗細。
代碼運行結果如下圖所示:
如果只想顯示x軸或y軸的網(wǎng)格線,可以對grid()函數(shù)的參數(shù)axis進行設置。該參數(shù)的默認值為'both',表示同時設置x軸和y軸的網(wǎng)格線,值為'x'或'y'時分別表示只設置x軸或y軸的網(wǎng)格線。
演示代碼如下:
1 plt.grid(b=True, axis='y', color='r', linestyle='dotted', linewidth=1)
代碼運行結果如下圖所示:
4. 調(diào)整坐標軸的刻度范圍
代碼文件:調(diào)整坐標軸的刻度范圍.py
使用Matplotlib模塊中的xlim()和ylim()函數(shù)可以分別調(diào)整x軸和y軸的刻度范圍。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 3 plt.rcParams['axes.unicode_minus'] = False 4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] 5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90] 6 plt.plot(x, y, color='r', linestyle='solid', linewidth=2, label='銷售額(萬元)') 7 plt.title(label='銷售額趨勢圖', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 30}, loc='center') 8 plt.legend(loc='upper left', fontsize=15) 9 for a,b in zip(x, y): 10 plt.text(a, b, b, ha='center', va='bottom', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 20}) 11 plt.ylim(40, 100) 12 plt.show()
第11行代碼中使用ylim()函數(shù)設置y軸刻度的取值范圍為40~100。如果要調(diào)整x軸的刻度范圍,使用xlim()函數(shù)即可。
代碼運行結果如下圖所示:
技巧:切換坐標軸的顯示和隱藏。
使用axis()函數(shù)可以切換坐標軸的顯示和隱藏。
演示代碼如下:
1 plt.axis('on') # 顯示坐標軸 2 plt.axis('off') # 隱藏坐標軸
3、繪制高級圖表
前面學習了常見圖表的繪制方法,以及圖表元素的添加和格式設置。接下來將繪制更加高級、專業(yè)的圖表,如氣泡圖、雷達圖、箱形圖等。
1. 繪制氣泡圖
代碼文件:繪制氣泡圖.py
氣泡圖是一種展示三個變量之間關系的圖表,它其實是在散點圖的基礎上升級改造而成的,在原有的x坐標和y坐標兩個變量的基礎上,引入第三個變量,并用氣泡的大小表示。因此,繪制氣泡圖要用到的函數(shù)就是繪制散點圖的scatter()函數(shù),只是參數(shù)的設置上有些區(qū)別。
演示代碼如下:
1 import matplotlib.pyplot as plt 2 import pandas as pd 3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 4 plt.rcParams['axes.unicode_minus'] = False 5 data = pd.read_excel('產(chǎn)品銷售統(tǒng)計.xlsx') 6 n = data['產(chǎn)品名稱'] 7 x = data['銷售量(件)'] 8 y = data['銷售額(元)'] 9 z = data['毛利率(%)'] 10 plt.scatter(x, y, s=z * 300, color='r', marker='o') 11 plt.xlabel('銷售量(件)', fontdict={'family': 'Microsoft YaHei', 'color': 'k', 'size': 20}, labelpad=20) 12 plt.ylabel('銷售額(元)', fontdict={'family': 'Microsoft YaHei', 'color': 'k', 'size': 20}, labelpad=20) 13 plt.title('銷售量、銷售額與毛利率關系圖', fontdict={'family': 'Microsoft YaHei', 'color': 'k', 'size': 30}, loc='center') 14 for a, b, c in zip(x, y, n): 15 plt.text(x=a, y=b, s=c, ha='center', va='center', fontsize=15, color='w') 16 plt.xlim(50, 600) 17 plt.ylim(2900, 11000) 18 plt.show()
繪制氣泡圖的關鍵是設置scatter()函數(shù)的參數(shù)s的值,該參數(shù)表示每個點的面積。當該參數(shù)為單個值時,表示所有點的面積相同,從而繪制出散點圖;當該參數(shù)為一個序列類型的值時,就可以分別為每個點設置不同的面積,從而繪制出氣泡圖。
第10行代碼中將參數(shù)s設置為序列類型的變量z,并將序列中的每個值放大300倍,這是因為毛利率的值較小,如果不放大,氣泡會太小,導致圖表不美觀。第16行和第17行代碼適當設置x軸和y軸的刻度范圍,讓氣泡顯示完全。
代碼運行結果如下圖所示:
2. 繪制組合圖
代碼文件:繪制組合圖.py
組合圖是指在一個坐標系中繪制多張圖表,其實現(xiàn)方式也很簡單,在使用Matplotlib模塊中的函數(shù)繪制圖表時設置多組y坐標值即可。
演示代碼如下:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 4 plt.rcParams['axes.unicode_minus'] = False 5 data = pd.read_excel('銷售業(yè)績表.xlsx') 6 x = data['月份'] 7 y1 = data['銷售額(萬元)'] 8 y2 = data['同比增長率'] 9 plt.bar(x, y1, color='c', label='銷售額(萬元)') 10 plt.plot(x, y2, color='r', linewidth=3, label='同比增長率') 11 plt.legend(loc='upper left', fontsize=15) 12 plt.show()
第7行和第8行代碼分別設置了兩組y坐標值,第9行代碼用第1組y坐標值繪制了一個柱形圖,第10行代碼用第2組y坐標值繪制了一個折線圖。
代碼運行結果如下圖所示:
從上圖可以看到,因為兩組y坐標值的數(shù)量級相差比較大,所以繪制出的組合圖中,代表同比增長的折線圖近乎一條直線,對分析數(shù)據(jù)完全沒有幫助。此時需要使用twinx()函數(shù)為圖表設置次坐標軸。
演示代碼如下(第1~8行與前面相同,從略):
9 plt.bar(x, y1, color='c', label='銷售額(萬元)') 10 plt.legend(loc='upper left', fontsize=15) 11 plt.twinx() 12 plt.plot(x, y2, color='r', linewidth=3, label='同比增長率') 13 plt.legend(loc='upper right', fontsize=15) 14 plt.show()
第9行代碼繪制了一個柱形圖,第10行代碼在圖表左上角為柱形圖添加圖例;第11行代碼使用twinx()函數(shù)為圖表添加次坐標軸;第12行代碼在次坐標軸中繪制了一個折線圖,第13行代碼在圖表右上角為折線圖添加圖例。
代碼運行結果如下圖所示:
3. 繪制直方圖
代碼文件:繪制直方圖.py
直方圖用于展示數(shù)據(jù)的分布情況,使用Matplotlib模塊中的hist()函數(shù)可以繪制直方圖。演示代碼如下:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 4 plt.rcParams['axes.unicode_minus'] = False 5 data = pd.read_excel('客戶年齡統(tǒng)計表.xlsx') 6 x = data['年齡'] 7 plt.hist(x, bins=9) 8 plt.xlim(15, 60) 9 plt.ylim(0, 40) 10 plt.title('年齡分布直方圖', fontsize=20) 11 plt.xlabel('年齡') 12 plt.ylabel('人數(shù)') 13 plt.grid(b=True, linestyle='dotted', linewidth=1) 14 plt.show()
第7行代碼中,hist()函數(shù)的參數(shù)bins用于設置直方圖中數(shù)據(jù)分組的組數(shù),也就是柱子的個數(shù)。
代碼運行結果如下圖所示:
4. 繪制雷達圖
代碼文件:繪制雷達圖.py
雷達圖可以同時比較和分析多個指標。該圖表可以看成一條或多條閉合的折線,因此,使用繪制折線圖的plot()函數(shù)也可以繪制雷達圖。
演示代碼如下:
1 import pandas as pd 2 import numpy as np 3 import matplotlib.pyplot as plt 4 plt.rcParams['font.sans-serif'] = ['SimHei'] 5 plt.rcParams['axes.unicode_minus'] = False 6 data = pd.read_excel('汽車性能指標分值統(tǒng)計表.xlsx') 7 data = data.set_index('性能評價指標') 8 data = data.T 9 data.index.name = '品牌' 10 def plot_radar(data, feature): 11 columns = ['動力性', '燃油經(jīng)濟性', '制動性', '操控穩(wěn)定性', '行駛平順性', '通過性', '安全性', '環(huán)保性', '方便性', '舒適性', '經(jīng)濟性', '容量性'] 12 colors = ['r', 'g', 'y'] 13 angles = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(columns), endpoint=False) 14 angles = np.concatenate((angles, [angles[0]])) 15 figure = plt.figure(figsize=(6, 6)) 16 ax = figure.add_subplot(1, 1, 1, projection='polar') 17 for i, c in enumerate(feature): 18 stats = data.loc[c] 19 stats = np.concatenate((stats, [stats[0]])) 20 ax.plot(angles, stats, '-', linewidth=2, c=colors[i], label=str(c)) 21 ax.fill(angles, stats, color=colors[i], alpha=0.75) 22 ax.legend(loc=4, bbox_to_anchor=(1.15, -0.07)) 23 ax.set_yticklabels([2, 4, 6, 8, 10]) 24 ax.set_thetagrids(angles * 180 / np.pi, columns, fontsize=12) 25 plt.show() 26 return figure 27 figure = plot_radar(data, ['A品牌', 'B品牌', 'C品牌'])
第10~26行代碼自定義了一個函數(shù)plot_radar(),該函數(shù)有兩個參數(shù),其中data是用于繪制圖表的數(shù)據(jù),feature是要展示的一個或多個品牌。
第11行代碼設置了在圖表中要展示的性能評價指標。第12行代碼用于設置每個品牌在圖表中的圖例顏色。第13行代碼根據(jù)要顯示的指標個數(shù)對圓形進行等分。第14行代碼用于連接刻度線數(shù)據(jù)。第15行代碼使用figure()函數(shù)創(chuàng)建了一張高和寬都為6英寸的畫布。第16行代碼使用add_subplot()函數(shù)將整張畫布劃分為1行1列,并在第1個區(qū)域中繪圖。第17~21行代碼使用for語句和plot()函數(shù)為指定的各個品牌繪制雷達圖。
第22行代碼中的loc=4表示圖例顯示在右下角,參數(shù)bbox_to_anchor則用于確定圖例在坐標軸方向上的位置。第23行代碼用于設置要顯示的刻度線數(shù)據(jù)值。第24行代碼用于在圖表中添加數(shù)據(jù)標簽。
代碼運行結果如下圖所示:
如果只想展示單個品牌的指標,將第27行代碼改為下面的代碼即可。
1 figure = plot_radar(data, ['B品牌'])
代碼運行結果如下圖所示:
5. 繪制樹狀圖
代碼文件: 繪制樹狀圖.py
樹狀圖通過矩形的面積、排列和顏色直觀地展示多個項目的數(shù)據(jù)比例關系。要繪制該圖表,需結合使用Matplotlib模塊與squarify模塊。
演示代碼如下:
1 import squarify as sf 2 import matplotlib.pyplot as plt 3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 4 plt.rcParams['axes.unicode_minus'] = False 5 x = ['上海', '北京', '重慶', '成都', '南京', '青島', '長沙', '武漢', '深圳'] 6 y = [260, 45, 69, 800, 290, 360, 450, 120, 50] 7 colors = ['lightgreen', 'pink', 'yellow', 'skyblue', 'cyan', 'silver', 'lightcoral', 'orange', 'violet'] 8 percent = ['11%', '2%', '3%', '33%', '12%', '15%', '18%', '5%', '2%'] 9 chart = sf.plot(sizes=y, label=x, color=colors, value=percent, edgecolor='white', linewidth=2) 10 plt.title(label='城市銷售額分布及占比圖', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 25}) 11 plt.axis('off') 12 plt.show()
第1行和第2行代碼分別導入squarify模塊和Matplotlib模塊。第5行代碼指定圖表中每一個矩形的文字標簽。第6行代碼指定每一個矩形的大小。第7行代碼指定每一個矩形的填充顏色。第8行代碼指定每一個矩形的數(shù)值標簽。第9行代碼使用squarify模塊中的plot()函數(shù)繪制樹狀圖。
代碼運行結果如下圖所示:
6. 繪制箱形圖
代碼文件:繪制箱形圖.py
箱形圖是一種用于展示數(shù)據(jù)的分布情況的統(tǒng)計圖,因形狀如箱子而得名。使用Matplotlib模塊中的boxplot()函數(shù)可以繪制箱形圖。
演示代碼如下:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] 4 plt.rcParams['axes.unicode_minus'] = False 5 data = pd.read_excel('1月銷售統(tǒng)計表.xlsx') 6 x1 = data['成都'] 7 x2 = data['上海'] 8 x3 = data['北京'] 9 x4 = data['重慶'] 10 x5 = data['南京'] 11 x = [x1, x2, x3, x4, x5] 12 labels = ['成都', '上海', '北京', '重慶', '南京'] 13 plt.boxplot(x, vert=True, widths=0.5, labels=labels, showmeans=True) 14 plt.title('各地區(qū)1月銷售額箱形圖', fontsize=20) 15 plt.ylabel('銷售額(萬元)') 16 plt.show()
第6~11行代碼給出了用于繪制箱形圖的數(shù)據(jù)。第12行代碼給出了x坐標值。第13行代碼中的參數(shù)vert用于設置箱形圖的方向,True表示縱向展示,F(xiàn)alse表示橫向展示;參數(shù)showmeans用于設置是否顯示均值,True表示顯示均值,F(xiàn)alse表示不顯示均值。
代碼運行結果如下圖所示:
箱形圖中的5條橫線和1個點所代表的含義如下:
- 下限:指所有數(shù)據(jù)中的最小值;
- 下四分位數(shù):又稱“第一四分位數(shù)”,指將所有數(shù)據(jù)從小到大排列后第25%的值;
- 中位數(shù):又稱“第二四分位數(shù)”,指將所有數(shù)據(jù)從小到大排列后第50%的值;
- 上四分位數(shù):又稱“第三四分位數(shù)”,指將所有數(shù)據(jù)從小到大排列后第75%的值;
- 上限:指所有數(shù)據(jù)中的最大值;
- 點:指所有數(shù)據(jù)的平均值。
7. 繪制玫瑰圖
代碼文件:繪制玫瑰圖.py
玫瑰圖可反映多個維度的數(shù)據(jù),它將柱形圖轉(zhuǎn)化為餅圖,在圓心角相同的情況下,以扇面長度展示指標大小。要繪制玫瑰圖,也要用到繪制柱形圖的bar()函數(shù)。
演示代碼如下:
1 import numpy as np 2 import pandas as pd 3 import matplotlib.pyplot as plt 4 plt.rcParams['font.sans-serif'] = ['SimHei'] 5 plt.rcParams['axes.unicode_minus'] = False 6 index = ['0~0.5', '0.6~2.0', '2.1~4.0', '4.1~6.0'] 7 columns = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'] 8 np.random.seed(0) 9 data = pd.DataFrame(np.random.randint(30, 300, (4, 16)), index=index, columns=columns) 10 N = 16 11 theta = np.linspace(0, 2 * np.pi, N, endpoint=False) 12 width = np.pi / N 13 labels = list(data.columns) 14 plt.figure(figsize=(6, 6)) 15 ax = plt.subplot(1, 1, 1, projection='polar') 16 for i in data.index: 17 radius = data.loc[i] 18 ax.bar(theta, radius, width=width, bottom=0.0, label=i, tick_label=labels) 19 ax.set_theta_zero_location('N') 20 ax.set_theta_direction(-1) 21 plt.title('各方向風速頻數(shù)玫瑰圖', fontsize=20) 22 plt.legend(loc=4, bbox_to_anchor=(1.3, 0.2)) 23 plt.show()
第6行代碼將風速的分布設置為4個區(qū)間。第7行代碼設置了16個方向。第8行代碼中的seed()函數(shù)用于產(chǎn)生相同的隨機數(shù)。第9行代碼創(chuàng)建一個4行16列的DataFrame,其中的數(shù)據(jù)是30~300范圍內(nèi)的隨機數(shù),行標簽為第6行代碼設置的風速分布區(qū)間,列標簽為第7行代碼設置的方向。
第10行代碼指定風速的方向數(shù)量為16。第11行代碼用于生成16個方向的角度值。第12行代碼用于計算扇面的寬度。第13行代碼用于定義坐標軸標簽為16個方向的名稱。
第14行代碼使用figure()函數(shù)創(chuàng)建一張高和寬都為6英寸的畫布。第15行代碼使用subplot()函數(shù)將整張畫布劃分為1行1列,并在第1個區(qū)域中繪圖。
第18行代碼使用bar()函數(shù)繪制玫瑰圖中的16根柱子,也就是扇面,參數(shù)bottom用于設置每根柱子底部的位置,這里設置為0.0,表示從圓心開始繪制。
第19行代碼用于設置0°的方向為“N”,即北方。第20行代碼用于設置按逆時針方向排列各個柱子。
代碼運行結果如下圖所示:
二、pyecharts模塊
pyecharts是基于ECharts圖表庫開發(fā)的Python第三方模塊。ECharts是一個純JavaScript的商業(yè)級圖表庫,兼容當前絕大部分瀏覽器,能夠創(chuàng)建類型豐富、精美生動、可交互、可高度個性化定制的數(shù)據(jù)可視化效果。pyecharts則在Python與ECharts之間搭建起一座橋梁,讓Python用戶也能使用ECharts的強大功能。
1、圖表配置項
代碼文件:圖表配置項.py
pyecharts模塊使用命令“pip install pyecharts”即可安裝。使用該模塊繪制圖表之前,首先要導入該模塊,導入語句通常寫成“from pyecharts.charts import 圖表類型關鍵詞”。導入模塊后,給出用于繪制圖表的數(shù)據(jù),即可繪制圖表。
下面以繪制柱形圖為例,講解pyecharts模塊的基本用法。
演示代碼如下:
1 from pyecharts.charts import Bar 2 x = ['連衣裙', '短褲', '運動套裝', '牛仔褲', '針織衫', '半身裙', '襯衫', '闊腿褲', '打底褲'] 3 y1 = [36, 56, 60, 78, 90, 20, 50, 70, 10] 4 y2 = [16, 30, 50, 90, 45, 10, 60, 54, 40] 5 chart = Bar() 6 chart.add_xaxis(x) 7 chart.add_yaxis('分店A', y1) 8 chart.add_yaxis('分店B', y2) 9 chart.render('圖表配置項.html')
第1行代碼導入pyecharts模塊中的Bar()函數(shù),該函數(shù)用于繪制柱形圖。如果要繪制其他類型的圖表,在此導入相應的圖表函數(shù)即可。
第2~4行代碼給出圖表的x坐標和y坐標的值,其中y坐標值有兩個數(shù)據(jù)系列。
第6行代碼中的add_xaxis()函數(shù)用于添加x坐標值。第7行和第8行代碼中的add_yaxis()函數(shù)用于依次添加兩個系列的y坐標值,該函數(shù)的第1個參數(shù)用于設置系列名稱,第2個參數(shù)用于設置系列數(shù)據(jù)。
第9行代碼中的render()函數(shù)用于將繪制的圖表保存為一個網(wǎng)頁文件,此處保存為代碼文件所在文件夾下的“圖表配置項.html”文件,保存路徑和文件名可以根據(jù)實際需求更改。
運行上面的代碼后,在代碼文件所在文件夾下會生成一個名為“圖表配置項.html”的網(wǎng)頁文件。雙擊該文件,可在默認瀏覽器中看到如下圖所示的柱形圖。
該柱形圖是靜態(tài)的,并且沒有圖表標題、坐標軸標題等元素。如果想要繪制個性化的動態(tài)圖表,可對圖表元素進行配置。在pyecharts模塊中,圖表的一切元素皆可配置,用于配置圖表元素的選項稱為配置項。配置項分為全局配置項和系列配置項兩種,這里主要介紹全局配置項。
全局配置項可通過pyecharts模塊中的set_global_opts()函數(shù)進行設置。使用該函數(shù)設置全局配置項時,要先導入pyecharts模塊的options子模塊。
全局配置項有很多內(nèi)容,每個配置項對應options子模塊中的一個函數(shù)。
常見圖表元素對應的配置項函數(shù)如下表所示:
每個配置項對應的函數(shù)有很多參數(shù),下面以圖例的配置項對應的LegendOpts()函數(shù)為例,簡單介紹配置項函數(shù)的參數(shù),具體見下表。
如果想了解更多配置項的知識,可以查閱pyecharts模塊的官方文檔,網(wǎng)址為https://pyecharts.org/#/zh-cn/global_options。
下面通過設置全局配置項,為前面繪制的柱形圖添加圖表標題、縮放滑塊、坐標軸標題等元素。
演示代碼如下:
1 from pyecharts import options as opts 2 chart.set_global_opts(title_opts=opts.TitleOpts(title='產(chǎn)品銷售額對比圖', pos_left='left'), 3 yaxis_opts=opts.AxisOpts(name='銷售業(yè)績(元)', name_location='end'), 4 xaxis_opts=opts.AxisOpts(name='產(chǎn)品', name_location='end'), 5 tooltip_opts=opts.TooltipOpts(is_show=True, formatter='{a}<br/>:{c}', background_color='black', border_width=15), 6 legend_opts=opts.LegendOpts(is_show=False), 7 toolbox_opts=opts.ToolboxOpts(is_show=True, orient='horizontal'), 8 visualmap_opts=opts.VisualMapOpts(is_show=True, type_='color', min_=0, max_=100, orient='vertical'), 9 datazoom_opts=opts.DataZoomOpts(is_show=True, type_='slider'))
在上面的代碼中,配置項TitleOpts()函數(shù)為圖表添加了圖表標題,并設置圖表標題位于左側(cè)。
配置項AxisOpts()函數(shù)為圖表分別添加了y軸標題“銷售業(yè)績(元)”和x軸標題“產(chǎn)品”,并設置坐標軸標題位于軸的尾部。
配置項TooltipOpts()函數(shù)設置了圖表的提示框,也就是將鼠標指針放在圖表的數(shù)據(jù)系列上時彈出的提示信息。
配置項LegendOpts()函數(shù)設置了不顯示圖例。
配置項ToolboxOpts()函數(shù)設置了工具箱以橫向布局顯示在圖表中。
配置項VisualMapOpts()函數(shù)設置了開啟視覺映射,并設置了視覺映射的顏色、最小值、最大值及布局方式。
配置項DataZoomOpts()函數(shù)設置了開啟區(qū)域縮放功能,并設置其類型為滑塊。
運行代碼后,打開生成的網(wǎng)頁文件,可看到如下圖所示的柱形圖。拖動下方的縮放滑塊,可動態(tài)展示部分產(chǎn)品的銷售額對比情況。
pyecharts模塊還內(nèi)置了多種風格的圖表主題,讓用戶可以更輕松地設置圖表的外觀。使用方法是先導入pyecharts模塊中的ThemeType對象,然后在圖表的函數(shù)中使用InitOpts()函數(shù)設置初始化配置項。
演示代碼如下:
1 from pyecharts.globals import ThemeType 2 chart = Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
第2行代碼在Bar()函數(shù)中使用InitOpts()函數(shù)設置圖表的主題風格為“DARK”,還可以設置為“LIGHT”“CHALK”“ESSOS”等。
設置主題后的圖表效果如下圖所示:
2、繪制漏斗圖
代碼文件:繪制漏斗圖.py
漏斗圖用于呈現(xiàn)從上到下的幾個階段的數(shù)據(jù),各階段的數(shù)據(jù)逐漸變小。使用pyecharts模塊中的Funnel()函數(shù)可以快速繪制漏斗圖。下面用該函數(shù)繪制一個漏斗圖,展示電商網(wǎng)站上從瀏覽商品到完成交易各階段人數(shù)的變化。
演示代碼如下:
1 import pyecharts.options as opts 2 from pyecharts.charts import Funnel 3 x = ['瀏覽商品', '放入購物車', '生成訂單', '支付訂單', '完成交易'] 4 y = [1000, 900, 400, 360, 320] 5 data = [i for i in zip(x, y)] 6 chart = Funnel() 7 chart.add(series_name='人數(shù)', data_pair=data, label_opts=opts.LabelOpts(is_show=True, position='inside'), tooltip_opts=opts.TooltipOpts(trigger='item', formatter='{a}:{c}')) 8 chart.set_global_opts(title_opts=opts.TitleOpts(title='電商網(wǎng)站流量轉(zhuǎn)化漏斗圖', pos_left='center'), legend_opts=opts.LegendOpts(is_show=False)) 9 chart.render('漏斗圖.html')
第5行代碼先用zip()函數(shù)將列表x和y中對應的元素配對打包成一個個元組,然后將這些元組組成一個列表。這一操作必不可少,因為Funnel()函數(shù)要求圖表的數(shù)據(jù)格式必須是由元組組成的列表,即[(key1, value1), (key2, value2), (……)]的格式。
技巧:列表推導式。
第5行代碼使用的生成列表的語法格式稱為列表推導式,它等同于如下代碼:
1 data = [] 2 for i in zip(x, y) 3 data.append(i)
列表推導式能讓代碼變得簡明扼要,它同樣適用于字典、集合等可迭代的數(shù)據(jù)結構。
第7行代碼中,add()函數(shù)的各個參數(shù)的作用如下:
- 參數(shù)series_name用于指定系列名稱。
- 參數(shù)data_pair用于指定系列數(shù)據(jù)值。
- 參數(shù)label_opts用于設置標簽,標簽的配置項又有多個參數(shù):
- 參數(shù)is_show用于控制是否顯示標簽,為True時表示顯示,為False時表示不顯示;
- 參數(shù)position用于設置標簽的位置,這里設置為'inside',表示標簽顯示在圖表內(nèi)部,該參數(shù)的值還可以為'top'、'left'、'right'等。參數(shù)tooltip_opts用于設置提示框,提示框的配置項又有多個參數(shù):參數(shù)trigger用于設置提示框的觸發(fā)類型,其值一般設置為'item',表示當鼠標指針放置在數(shù)據(jù)系列上時就顯示提示框;參數(shù)formatter用于設置提示框的顯示內(nèi)容,這里的{a}代表系列名稱,{c}代表數(shù)據(jù)值。
運行代碼后,得到的圖表效果如下圖所示:
如果想要讓漏斗圖倒立,可在add()函數(shù)中使用參數(shù)sort_調(diào)整數(shù)據(jù)圖形的排列方向。此外,還可以在add()函數(shù)中使用參數(shù)gap設置數(shù)據(jù)圖形的間距。
演示代碼如下:
1 chart.add(series_name='人數(shù)', data_pair=data, sort_='ascending', gap=15, label_opts=opts.LabelOpts(is_show=True, position='inside'), tooltip_opts=opts.TooltipOpts(trigger='item', formatter='{a}:{c}'))
運行代碼后,得到的圖表效果如下圖所示。
3、繪制漣漪特效散點圖
代碼文件:繪制漣漪特效散點圖.py
前面介紹過使用Matplotlib模塊中的plot()函數(shù)繪制散點圖的方法,用這種方法繪制的散點圖是靜態(tài)的。使用pyecharts模塊中的EffectScatter()函數(shù)則能繪制帶有漣漪特效的散點圖。
演示代碼如下:
1 import pandas as pd 2 import pyecharts.options as opts 3 from pyecharts.charts import EffectScatter 4 data = pd.read_excel('客戶購買力統(tǒng)計表.xlsx') 5 x = data['年齡'].tolist() 6 y = data['消費金額(元)'].tolist() 7 chart = EffectScatter() 8 chart.add_xaxis(x) 9 chart.add_yaxis(series_name='年齡,消費金額(元)', y_axis=y, label_opts=opts.LabelOpts(is_show=False), symbol_size=15) 10 chart.set_global_opts(title_opts=opts.TitleOpts(title='客戶購買力散點圖'), yaxis_opts=opts.AxisOpts(type_='value', name='消費金額(元)', name_location='middle', name_gap=40), xaxis_opts=opts.AxisOpts(type_='value', name='年齡', name_location='middle', name_gap=40), tooltip_opts=opts.TooltipOpts(trigger='item', formatter='{a}:{c}')) 11 chart.render('漣漪特效散點圖.html')
第5行和第6行代碼從DataFrame中選取數(shù)據(jù)后,使用tolist()函數(shù)將選取的數(shù)據(jù)轉(zhuǎn)換為列表格式,這是因為pyecharts模塊只支持Python原生的數(shù)據(jù)類型,包括int、float、str、bool、dict、list。
第9行代碼中,add_yaxis()函數(shù)的參數(shù)label_opts與add()函數(shù)的同名參數(shù)含義相同,參數(shù)symbol_size用于設置標記的大小。
第10行代碼中,參數(shù)title_opts用于設置圖表標題;參數(shù)yaxis_opts和xaxis_opts分別用于設置y坐標軸和x坐標軸,對應的配置項函數(shù)AxisOpts()的參數(shù)type_用于設置坐標軸的類型[這里設置為'value'(數(shù)值軸),還可以設置為'category'(類目軸)、'time'(時間軸)、'log'(對數(shù)軸)],參數(shù)name用于設置坐標軸標題,參數(shù)name_location用于設置坐標軸標題相對于軸線的位置(這里設置為居中顯示),參數(shù)name_gap用于設置坐標軸標題與軸線的間距(這里設置為40 px)。
運行代碼后,得到的圖表效果如下圖所示:
4、繪制水球圖
代碼文件:繪制水球圖.py
水球圖適合用于展示單個百分數(shù)。使用pyecharts模塊中的Liquid()函數(shù)可以繪制水球圖,通過非常簡單的配置就能獲得酷炫的展示效果。
演示代碼如下:
1 import pyecharts.options as opts 2 from pyecharts.charts import Liquid 3 a = 68 4 t = 100 5 chart = Liquid() 6 chart.add(series_name='商品A', data=[a / t]) 7 chart.set_global_opts(title_opts=opts.TitleOpts(title='產(chǎn)品銷售業(yè)績達成率', pos_left='center')) 8 chart.render('水球圖.html')
第3行和第4行代碼分別給出產(chǎn)品的實際銷售業(yè)績和目標銷售業(yè)績。第6行代碼中,add()函數(shù)的參數(shù)data用于指定系列數(shù)據(jù),本案例要展示銷售業(yè)績達成率,使用實際銷售業(yè)績除以目標銷售業(yè)績即可。需要注意的是,參數(shù)data的格式必須為一個列表。
運行代碼后,得到的圖表效果如下圖所示:
Liquid()函數(shù)繪制的水球圖的默認形狀為圓形,可以通過設置參數(shù)shape的值來改變水球圖的形狀。該參數(shù)的值可以為'circle'、'rect'、'roundRect'、'triangle'、'diamond'、'pin'、'arrow',對應的形狀分別為圓形、矩形、圓角矩形、三角形、菱形、地圖圖釘、箭頭。
演示代碼如下:
1 chart.add(series_name='商品A', data=[a / t], shape='rect')
運行代碼后,得到的圖表效果如下圖所示:
如果希望在一個水球圖中繪制多個水球,可以通過設置add()函數(shù)的參數(shù)center來實現(xiàn)。
演示代碼如下:
1 import pyecharts.options as opts 2 from pyecharts.charts import Liquid 3 a1 = 68 4 a2 = 120 5 a3 = 37 6 t = 100 7 chart = Liquid() 8 chart.set_global_opts(title_opts=opts.TitleOpts(title='產(chǎn)品銷售業(yè)績達成率', pos_left='center')) 9 chart.add(series_name='商品A', data=[a1 / t], center=['20%', '50%']) 10 chart.add(series_name='商品B', data=[a2 / t], center=['50%', '50%']) 11 chart.add(series_name='商品C', data=[a3 / t], center=['80%', '50%']) 12 chart.render('水球圖.html')
第3~6行代碼分別指定了3個產(chǎn)品的實際銷售業(yè)績和相同的目標銷售業(yè)績。
第7行代碼創(chuàng)建了一個水球圖。第8行代碼為水球圖添加了居中顯示的圖表標題。
第9~11行代碼使用add()函數(shù)依次在水球圖中繪制了3個水球。函數(shù)的參數(shù)center用于指定水球的中心點在圖表中的位置。
運行代碼后,得到的圖表效果如下圖所示:
5、繪制儀表盤
代碼文件:繪制儀表盤.py
儀表盤同水球圖一樣,也適合用于展示單個百分數(shù)。使用pyecharts模塊中的Gauge()函數(shù)可以繪制儀表盤。
演示代碼如下:
1 import pyecharts.options as opts 2 from pyecharts.charts import Gauge 3 chart = Gauge() 4 chart.add(series_name='業(yè)務指標', data_pair=[('完成率', '62.25')], split_number=10, radius='80%', title_label_opts=opts.LabelOpts(font_size=30, color='red', font_family='Microsoft YaHei')) 5 chart.set_global_opts(legend_opts=opts.LegendOpts(is_show=False), tooltip_opts=opts.TooltipOpts(is_show=True, formatter='{a}<br/>:{c}%')) 6 chart.render('儀表盤.html')
第4行代碼中的參數(shù)split_number用于指定儀表盤的平均分割段數(shù),這里設置為10段;參數(shù)radius用于設置儀表盤的半徑,其值可以是百分數(shù)或數(shù)值;參數(shù)title_label_opts用于設置儀表盤內(nèi)標題文本標簽的配置項。
運行代碼后,得到的圖表效果如下圖所示:
6、繪制詞云圖
代碼文件:繪制詞云圖.py
詞云圖是一種用于展示高頻關鍵詞的圖表,它通過文字、顏色、圖形的搭配,產(chǎn)生極具沖擊力的視覺效果。使用pyecharts模塊中的WordCloud()函數(shù)可以繪制詞云圖。
演示代碼如下:
1 import pandas as pd 2 import pyecharts.options as opts 3 from pyecharts.charts import WordCloud 4 data = pd.read_excel('電影票房統(tǒng)計.xlsx') 5 name = data['電影名稱'] 6 value = data['總票房(億元)'] 7 data1 = [z for z in zip(name, value)] 8 chart = WordCloud() 9 chart.add('總票房(億元)', data_pair=data1, word_size_range=[6, 66]) 10 chart.set_global_opts(title_opts=opts.TitleOpts(title='電影票房分析', title_textstyle_opts=opts.TextStyleOpts(font_size=30)), tooltip_opts=opts.TooltipOpts(is_show=True)) 11 chart.render('詞云圖.html')
第9行代碼中,add()函數(shù)的參數(shù)word_size_range用于設置詞云圖中每個詞的字號的變化范圍。運行代碼后,得到的圖表效果如下圖所示。
與水球圖類似,通過設置參數(shù)shape的值可以改變詞云圖的外形輪廓,可取的值有'circle'、'cardioid'、'diamond'、'triangle-forward'、'triangle'、'pentagon'、'star'。
演示代碼如下:
1 chart.add('總票房(億元)', data_pair=data1, shape='star', word_size_range=[6, 66])
運行代碼后,得到的圖表效果如下圖所示:
感興趣的朋友可以利用自然語言處理方法對一批文本進行分詞并統(tǒng)計詞頻,再使用詞頻數(shù)據(jù)繪制詞云圖。
7、繪制K線圖
代碼文件:繪制K線圖.py
K線圖用于反映股價信息,又稱蠟燭圖、股價圖。所有的K線圖都是圍繞開盤價、收盤價、最低價和最高價這4個數(shù)據(jù)展開的。使用pyecharts模塊中的Kline()函數(shù)可以繪制K線圖。
利用Tushare模塊獲取股價數(shù)據(jù),這里以獲取股票代碼為000005的股票從2010年1月1日到2020年1月1日的日K線級別的股價數(shù)據(jù)為例。
演示代碼如下:
1 import tushare as ts 2 data = ts.get_k_data('000005', start='2010-01-01', end='2020-01-01') 3 print(data.head())
代碼運行結果如下(date列為交易日期,open列為開盤價,close列為收盤價,high列為最高價,low列為最低價,volume列為成交量,code列為股票代碼):
1 date open close high low volume code 2 0 2010-01-04 6.01 5.99 6.05 5.91 223582.22 000005 3 1 2010-01-05 5.95 6.20 6.32 5.83 644252.42 000005 4 2 2010-01-06 6.13 6.08 6.28 6.06 494034.08 000005 5 3 2010-01-07 6.03 5.83 6.07 5.82 314417.23 000005 6 4 2010-01-08 5.80 5.89 5.93 5.74 167892.49 000005
將獲取的股價數(shù)據(jù)寫入Excel工作簿。
演示代碼如下:
1 data.to_excel('股價數(shù)據(jù).xlsx', index=False)
運行代碼后,在代碼文件所在文件夾生成一個名為“股價數(shù)據(jù).xlsx”的Excel工作簿。打開該工作簿,可看到獲取的股價數(shù)據(jù),如下圖所示。
完成股價數(shù)據(jù)的獲取后,就可以使用Kline()函數(shù)繪制K線圖了。
演示代碼如下:
1 import pandas as pd 2 from pyecharts import options as opts 3 from pyecharts.charts import Kline 4 data = pd.read_excel('股價數(shù)據(jù).xlsx') 5 x = data['date'].tolist() 6 open = data['open'] 7 close = data['close'] 8 lowest = data['low'] 9 highest = data['high'] 10 y = [z for z in zip(open, close, lowest, highest)] 11 chart = Kline() 12 chart.add_xaxis(x) 13 chart.add_yaxis('股價', y) 14 chart.set_global_opts(xaxis_opts=opts.AxisOpts(is_scale=True), yaxis_opts=opts.AxisOpts(is_scale=True, splitarea_opts=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1))), datazoom_opts=[opts.DataZoomOpts(type_='inside')], title_opts=opts.TitleOpts(title='股價走勢圖')) 15 chart.render('K線圖.html')
第6~9行代碼分別指定了用于繪制K線圖的開盤價、收盤價、最低價、最高價數(shù)據(jù)。第10行代碼將這些數(shù)據(jù)打包成由元組組成的列表,作為y坐標的值。需要注意的是,y坐標的值一定要按開盤價、收盤價、最低價、最高價的順序排列。
第14行代碼中的SplitAreaOpts()是系列配置項中的分隔區(qū)域配置項,用于設置在圖表數(shù)據(jù)系列的背景區(qū)域中是否顯示顏色交錯填充的分割效果,參數(shù)opacity用于設置不透明度,取值范圍為0~1,為0時完全透明,為1時完全不透明。
運行代碼后,得到的圖表效果如下圖所示:
第14行代碼中還使用配置項DataZoomOpts()函數(shù)為圖表添加了區(qū)域縮放滑塊。曾使用DataZoomOpts()函數(shù)為柱形圖添加了顯示在圖表底部的滑塊,這里添加的滑塊則是隱藏在圖表中的。用鼠標左右拖動圖表,可以看到不同時期的數(shù)據(jù);將鼠標指針放置在圖表中,然后滑動鼠標滾輪,可看到圖表會隨著滾輪的滑動而縮放。
此外,將鼠標指針放置在數(shù)據(jù)系列上,會顯示鼠標指針所指向的那一天的詳細股價數(shù)據(jù),如下圖所示。
以上就是Python數(shù)據(jù)可視化詳解的詳細內(nèi)容,更多關于Python數(shù)據(jù)可視化的資料請關注腳本之家其它相關文章!
相關文章
django開發(fā)教程之利用緩存文件進行頁面緩存的方法
緩存相信對各位程序員們來說都不陌生,下面這篇文章主要給大家介紹了關于django開發(fā)教程之利用緩存文件進行頁面緩存的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們可以參考借鑒,下面隨著小編來一起學習學習吧。2017-11-11Python采用Django開發(fā)自己的博客系統(tǒng)
這篇文章主要為大家詳細介紹了Python采用Django開發(fā)自己的博客系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08一文教你如何用Python輕輕松松操作Excel,Word,CSV
數(shù)據(jù)處理是 Python 的一大應用場景,而 Excel 又是當前最流行的數(shù)據(jù)處理軟件。本文將為大家詳細介紹一下如何用Python輕輕松松操作Excel、Word、CSV,需要的可以參考一下2022-02-02