作者:周蘿卜
來源:蘿卜大雜燴
今天我們來學(xué)習(xí)下數(shù)據(jù)可視化,其實在前面的章節(jié)中,我們也接觸到了一些數(shù)據(jù)可視化的知識,在分析數(shù)據(jù)集的時候,有效的可視化圖表,可以幫助我們更好的了解數(shù)據(jù)。
我們常用的圖表其實也有很多,比如說文本表格,條形圖,餅圖等等。下面我就來簡單介紹10種常見的圖表
散點圖
散點圖一般是兩個變量的二維圖表,很適合展示兩個變量之間的關(guān)系。當(dāng)然也有三維散點圖,不過使用的并不是很多
折線圖
折線圖可以很好的呈現(xiàn)數(shù)據(jù)隨著時間遷移的變化趨勢
直方圖
直方圖把橫坐標(biāo)等分成一定數(shù)量的區(qū)間,然后再每個區(qū)間內(nèi)用矩形條展示該區(qū)間內(nèi)的數(shù)值,可以很好的查看數(shù)據(jù)的分布情況
條形圖
條形圖可以查看數(shù)據(jù)中不同類別之間的分布請求
盒式圖
是由五個數(shù)值組成:最大值(max)、最小值(min)、中位數(shù)(median)和上下四分位數(shù)(Q3,Q1),可以幫助我們分析數(shù)據(jù)的差異性、離散程度和異常值等信息
餅圖
餅圖可以很好的呈現(xiàn)每類數(shù)據(jù)所占總數(shù)據(jù)的比例情況
熱力圖
熱力圖是把數(shù)據(jù)用矩陣表示的形式,不同數(shù)據(jù)顏色不同,可以通過顏色直觀的判斷某個位置上的數(shù)值情況
雷達(dá)圖
可以很好的顯示一對多的關(guān)系,比如王者榮耀中的對局信息,就是雷達(dá)圖
地理圖表
對于按照不同地理位置區(qū)分的數(shù)據(jù),使用地理圖表可以很直觀的呈現(xiàn)數(shù)據(jù)信息
詞云圖
詞云圖是非常好的可視化圖表,在分析評論等場景非常常見
其實,我們也可以根據(jù)數(shù)據(jù)之間的關(guān)系,把可視化圖表分成如下幾類
聯(lián)系
查看多個變量之間的關(guān)系,例如:散點圖,雷達(dá)圖
比較
比較數(shù)據(jù)間各類別的關(guān)系,例如:條形圖
趨勢
展示數(shù)據(jù)隨時間的變化趨勢,例如:折線圖
構(gòu)成
各部分占總體的百分比,例如:餅圖
分布
關(guān)注變量的分布情況,例如:直方圖
下面有兩張圖片,很好的概括了不同情況下,該如何選擇合適的圖表
在以后的工作中,如果遇到可視化工作,又不太確定如何更好的呈現(xiàn)數(shù)據(jù),可以來看看上面的圖片,也許能找到靈感。
下面我們就來逐一完成上面的十個圖表,看看 Python 帶給你的視覺體驗。
我們會分別使用 Matplotlib、Seaborn 和 Pyecharts 來完成作圖,需要提前下載好對應(yīng)的庫
pip install matplotlib
pip install seaborn
pip install pyecharts
我們會使用 seaborn 自帶的數(shù)據(jù)集為例子,所以需要導(dǎo)入數(shù)據(jù)集
import matplotlib.pyplot as plt
import seaborn as sns
tips = sns.load_dataset('tips')
print(tips.head())
>>>
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
matplotlib 實現(xiàn)散點圖
matplotlib.pyplot.scatter(x, y, c=None, marker=None)
幾個重要的參數(shù)
x,y:數(shù)值坐標(biāo)
c:點的顏色
marker:標(biāo)記的符號,可以選擇“x”,“>” 或 “o”
seaborn 實現(xiàn)散點圖
sns.scatterplot(x=None, y=None, hue=None, style=None, size=None, data=None)
x,y:傳入的數(shù)據(jù)間 data 的列的名字
hue:按照列名分組,不同組展示不同顏色
style:按照列名分組,不同分組使用不同的 marker
size:按照列名分組,不同分組符號大小不同
data:傳入的數(shù)據(jù)集
plt.scatter(tips['total_bill'], tips['tip'], c='#bcbd22', marker='x')
plt.show()
sns.scatterplot(x='total_bill', y='tip', hue='time', style='time', size='time', data=tips)
plt.show()
Matplotlib 繪制:
Seaborn 繪制:
兩種作圖整體分布式類似的,不過 Seaborn 作為 Matplotlib 的更高級 API 實現(xiàn),可以更加方便的處理數(shù)據(jù)的分組展示等功能。
pycharts 實現(xiàn)散點圖
pyecharts 是基于 echarts 的 Python 實現(xiàn),同樣擁有強(qiáng)大的功能,而且擁有完善的中文文檔,這里就不再過多講解 pyecharts 的用法了。
scatter = Scatter()
scatter.add_xaxis(tips['total_bill'])
scatter.add_yaxis('小費金額', tips['tip'])
scatter.set_global_opts(xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)),
yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)),
toolbox_opts=opts.ToolboxOpts(is_show=True)
)
scatter.render_notebook() # 在 jupyter notebook 中展示
# scatter.render('scatter.html') # 生成 HTML 文件,可以在瀏覽器中打開查看
matplotlib 實現(xiàn)折線圖
matplotlib.pyplot.plot(x, y)
x,y:分別是橫縱坐標(biāo),x 需要是按照大小排序的數(shù)組
seaborn 實現(xiàn)折線圖
seaborn.lineplot(x=None, y=None, data=None)
關(guān)鍵的參數(shù)與散點圖十分類似,這里不再贅述
tips_copy = tips.copy()
tips_copy.sort_values(by='total_bill', inplace=True)
plt.plot(tips_copy['total_bill'], tips_copy['tip'])
plt.show()
sns.lineplot(x='total_bill', y='tip', data=tips, )
plt.show()
Matplotlib 繪制:
Seaborn 繪制:
可以看到,使用 seaborn 庫,x 軸上的元素會自動被排序
pyecharts 實現(xiàn)折線圖
from pyecharts.charts import Line
line = Line()
line.add_xaxis(tips_copy['total_bill'])
line.add_yaxis('', tips_copy['tip'])
line.render_notebook()
matplotlib 實現(xiàn)直方圖
matplotlib.pyplot.hist(x, bins=None)
x:要輸入的一維數(shù)組
bins:是直方圖中區(qū)域的數(shù)量
seaborn 實現(xiàn)直方圖
seaborn.distplot(a, kde=True)
a:觀測數(shù)據(jù)
kde:是否畫估計曲線
import numpy as np
x = np.random.randn(100)
plt.hist(x, 10)
plt.show()
sns.distplot(x, 10)
plt.show()
Matplotlib 繪制:
Seaborn 繪制:
Pyecharts(echarts) 并沒有專門的直方圖方法。
matplotlib 實現(xiàn)條形圖
matplotlib.pyplot.bar(x, height, width=0.8)
x:x 軸的坐標(biāo)值
height:y 軸的坐標(biāo)值
width:條形的寬度
seaborn 實現(xiàn)條形圖
seaborn.barplot(x=None, y=None, hue=None, data=None)
x,y,hue:分別是兩個坐標(biāo)軸的名稱和圖例名稱
data:傳入的數(shù)據(jù)
new_tips = tips.groupby('day').mean()
plt.bar(new_tips.index.values.tolist(), new_tips['total_bill'].values.tolist(), width=0.5)
plt.show()
sns.barplot(x='day', y='total_bill', hue='sex', data=tips)
plt.show()
Matplotlib 繪制:
Seaborn 繪制:
可以看到,Seaborn 可以進(jìn)行方便的分組繪制。
pyecharts 實現(xiàn)條形圖
from pyecharts.charts import Barbar = Bar()
bar.add_xaxis(new_tips.index.values.tolist())
bar.add_yaxis('', new_tips['total_bill'].values.tolist())
bar.render_notebook()
matplotlib 實現(xiàn)盒式圖(箱形圖)
matplotlib.pyplot.boxplot(x, notch=None, label=None)
x:需要傳入的數(shù)據(jù)
notch:為是否展示帶有缺口的箱形
label:可以設(shè)置標(biāo)簽
seaborn 實現(xiàn)盒式圖
seaborn.boxplot(x=None, y=None, hue=None, data=None)
plt.boxplot(tips['total_bill'], notch=True)
plt.show()
sns.boxplot(x=tips['day'], y='total_bill', data=tips)
plt.show()
Matplotlib 繪制:
Seaborn 繪制:
Pyecharts 對于盒式圖支持的并不友好,不推薦使用,這里只給出官網(wǎng)例子
from pyecharts.charts import Boxplot
v1 = [
[850, 740, 900, 1070, 930, 850, 950, 980, 980, 880]
+ [1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
[960, 940, 960, 940, 880, 800, 850, 880, 900]
+ [840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
]
box = Boxplot()
box.add_xaxis(['expr1'])
box.add_yaxis('', box.prepare_data(v1))
box.render_notebook()
matplotlib 實現(xiàn)餅圖
matplotlib.pyplot.pie(x, explode=None, labels=None)
x:需要用到的數(shù)據(jù)
explode:扇形偏移量
labels:扇形的標(biāo)簽
seaborn 并未提供餅圖的高級 API
sizes = [17, 32, 44, 10]
labels = ['cat', 'dog', 'fox', 'tiger']
explode = (0, 0.1, 0, 0)
plt.pie(sizes, labels=labels, explode=explode)
plt.show()
pyecharts 實現(xiàn)餅圖
from pyecharts.charts import Pie
mylist = [list(z) for z in zip(labels, sizes)]
pie = Pie()
pie.add('', mylist)
pie.render_notebook()
對于熱力圖,一般使用 Seaborn 提供的更加高級的 API 來實現(xiàn)
seaborn.heatmap(data)
data:DataFrame 類型數(shù)據(jù)即可
flights = sns.load_dataset('flights')
flights_new = flights.pivot(index='month', columns='year', values='passengers')
sns.heatmap(flights_new)
plt.show()
pyecharts 實現(xiàn)熱力圖
x = flights_new.columns.values.tolist()
y = flights_new.index.values.tolist()
value = flights_new.values.tolist()L = []
i = j = 0
for inner_list in value:
for v in inner_list:
L.append([i, j, v])
j += 1
i += 1
j = 0
from pyecharts.charts import HeatMap
from pyecharts import options as opts
heatmap = HeatMap()
heatmap.add_xaxis(x)
heatmap.add_yaxis('', y, L)
heatmap.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_=650, min_=90)
)
heatmap.render_notebook()
Matplotlib 和 Seaborn 都沒有直接提供雷達(dá)圖的 API,我們需要手動實現(xiàn)一個
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 數(shù)據(jù)準(zhǔn)備
labels=np.array([u' 推進(jìn) ','KDA',u' 生存 ',u' 團(tuán)戰(zhàn) ',u' 發(fā)育 ',u' 輸出 '])
stats=[83, 61, 95, 67, 76, 88]
# 畫圖數(shù)據(jù)準(zhǔn)備,角度、狀態(tài)值
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)
stats=np.concatenate((stats,[stats[0]]))
angles=np.concatenate((angles,[angles[0]]))
# 用 Matplotlib 畫蜘蛛圖
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
# 設(shè)置中文字體
font = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf', size=14)
ax.set_thetagrids(angles * 180/np.pi, labels, FontProperties=font)
plt.show()
plt.figure 相當(dāng)于是創(chuàng)建一個畫板,add_subplot 就是將畫板劃分,然后再通過 plot 和 fill 作畫
pyecharts 實現(xiàn)雷達(dá)圖
from pyecharts.charts import Radar
ability = [[83, 61, 95, 67, 76, 88]]
radar = Radar()
radar.add_schema(
schema=[
opts.RadarIndicatorItem(name='推進(jìn)', max_=100),
opts.RadarIndicatorItem(name='KDA', max_=100),
opts.RadarIndicatorItem(name='生存', max_=100),
opts.RadarIndicatorItem(name='團(tuán)戰(zhàn)', max_=100),
opts.RadarIndicatorItem(name='發(fā)育', max_=100),
opts.RadarIndicatorItem(name='輸出', max_=100),
]
)
radar.add('', ability)
radar.render_notebook()
對于需要展示地理分布的數(shù)據(jù),使用地圖分布圖表是非常方便的,echarts 提供了好好的支持,因此我們也可以使用 pyecharts 的高級 API 來制作地理圖表
from pyecharts.charts import Geo
provinces = ['廣東', '北京', '上海', '江西', '湖南', '浙江', '江蘇']
values = [120, 96, 72, 97, 54, 138, 97]
geo = Geo()
geo.add_schema(maptype='china')
geo.add('', [list(z) for z in zip(provinces, values)])
geo.render_notebook()
只需要傳入一個列表,列表里包含省份名稱和對應(yīng)省份的數(shù)值。這個數(shù)值就是具體的業(yè)務(wù)數(shù)據(jù),比如可以是該省份的產(chǎn)值,高校數(shù)量,人口總數(shù)等等。
from pyecharts.charts import WordCloud
words = [
('開心', 1000),
('傷心', 4002),
('吃飯', 5008),
('上課', 3000),
('工作', 5980),
('學(xué)習(xí)', 2357),
('算法', 5300),
('Python', 3478),
('入門', 2300),
('同學(xué)', 4000),
('出發(fā)', 5378),
('java', 6700),
('Linux', 1000),
('教學(xué)', 2198),
('公司', 4570),
('政府', 1000),
('同事', 4350),
('朋友', 3444),
('家人', 1000),
('親人', 4300),
('城市', 2000),
]
wordcloud = WordCloud()
wordcloud.add('', words)
wordcloud.render_notebook()
同樣是傳入列表,包含需要展示的詞語和該詞語對應(yīng)的頻度,該頻度也會決定詞語的大小。
相信大家通過上面10個圖表的學(xué)習(xí),已經(jīng)能夠基本掌握 Python 可視化的知識了。你也應(yīng)該發(fā)現(xiàn),在數(shù)據(jù)分析的過程中,大多數(shù)情況下使用 Seaborn 是比較方便的,它可以很好的結(jié)合 DataFrame 數(shù)據(jù)類型,而在最后的數(shù)據(jù)展示時,使用 Pyecharts(echarts)則是很好的選擇,它涵蓋了非常強(qiáng)大的 API,可以對生成的圖表再做后續(xù)的操作,當(dāng)然 Matplotlib 是最為基礎(chǔ),也是最為強(qiáng)大的工具,在實際的工作中,需要好好衡量,選擇最適合的工具來做可視化的工作。
今天我們一起學(xué)習(xí)了常用的可視化圖表以及如何制作相關(guān)圖表。對于 Matplotlib、Seaborn 和 Pyecharts 工具包的使用一定要熟練的掌握,在數(shù)據(jù)分析的過程中會經(jīng)常使用。同時還要知道,Seaborn 是基于 Matplotlib 的更加高級的可視化庫,類似于 NumPy 和 Pandas 的關(guān)系。
同時我們還按照數(shù)據(jù)之間的關(guān)系,劃分了不同類型的圖表,希望能夠在未來幫助你更好的選擇圖表。當(dāng)然對于單分類和多分類數(shù)據(jù),也可以使用組合圖表來進(jìn)行可視化處理。這三個工具包的官方文檔都是非常好的學(xué)習(xí)工具,希望大家能夠在后面的學(xué)習(xí)中好好利用,多加探索。
其實 Seaborn 自帶了很多好玩的數(shù)據(jù)集,比如我們用到的 tips 和 flights 數(shù)據(jù)集,還有 car_crashes 數(shù)據(jù)集,是一個關(guān)于車禍的數(shù)據(jù)集,那么你能夠使用該數(shù)據(jù)集,做一些探索嗎,看看可以制作出哪些好玩的可視化圖表?
聯(lián)系客服