五個Python數(shù)據(jù)可視化技巧,繪制更漂亮的數(shù)據(jù)圖
在數(shù)據(jù)驅(qū)動決策的時代,數(shù)據(jù)可視化是挖掘數(shù)據(jù)價值的重要一環(huán)。今天,安利大家五種極為實用的高級可視化圖表,從原理到代碼實現(xiàn),一站式帶你搞定!
7 Best Python Visualization Techniques for EDA: Enhance Insights | by Meng Li | Top Python Libraries | Medium
1.和弦圖
和弦圖以富有創(chuàng)意的方式呈現(xiàn)數(shù)據(jù)點間的復(fù)雜關(guān)系。
在和弦圖中,節(jié)點環(huán)繞成一個圓形,通過弧線彼此相連?;¢L對應(yīng)連接值的大小,而弧線的粗細(xì)則直觀體現(xiàn)關(guān)系的重要程度。同時,利用不同顏色對數(shù)據(jù)進(jìn)行分類,方便用戶進(jìn)行對比分析。
因其強大的關(guān)系展示能力,和弦圖被廣泛應(yīng)用于眾多領(lǐng)域,在基因數(shù)據(jù)可視化方面表現(xiàn)尤為突出。
圖片
下面用 Holoviews 和 Bokeh 庫,來創(chuàng)建一個展示五個國家貿(mào)易關(guān)系的和弦圖。
import holoviews as hv
from holoviews import opts
import pandas as pd
import numpy as np
hv.extension('bokeh')
# 代表5個國家之間出口量的示例矩陣
export_data = np.array([[0, 50, 30, 20, 10],
[10, 0, 40, 30, 20],
[20, 10, 0, 35, 25],
[30, 20, 10, 0, 40],
[25, 15, 30, 20, 0]])
labels = ['美國', '中國', '德國', '日本', '印度']
# 創(chuàng)建一個pandas DataFrame
df = pd.DataFrame(export_data, index=labels, columns=labels)
df = df.stack().reset_index()
df.columns = ['來源', '目標(biāo)', '數(shù)值']
# 創(chuàng)建一個Chord對象
chord = hv.Chord(df)
# 對和弦圖進(jìn)行樣式設(shè)置
chord.opts(
opts.Chord(
cmap='Category20', edge_cmap='Category20',
labels='source', label_text_font_size='10pt',
edge_color='source', node_color='index',
width=700, height=700
)
).select(value=(5, None))
# 顯示圖表
chord
圖片
2.旭日圖
旭日圖超越了傳統(tǒng)的餅圖和環(huán)形圖,能夠清晰展示層次結(jié)構(gòu)數(shù)據(jù)。
旭日圖用同心圓表示不同層級,中心是根節(jié)點,扇形代表具體節(jié)點。扇形大小和數(shù)據(jù)值掛鉤,數(shù)據(jù)重要程度一目了然。
在可視化文件系統(tǒng)層級結(jié)構(gòu)、用戶導(dǎo)航路徑、市場細(xì)分和基因數(shù)據(jù)等方面很有用。
下面是使用Plotly庫創(chuàng)建旭日圖的示例。
import plotly.express as px
import numpy as np
df = px.data.gapminder().query("year == 2007")
fig = px.sunburst(df, path=['continent', 'country'],
values='pop',
color='lifeExp',
hover_data=['iso_alpha'],
color_continuous_scale='RdBu',
color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']))
fig.show()
圖片
3.六邊形熱力圖
圖片
六邊形熱力圖(Hexbin Plot),即六邊形分箱圖,在可視化二維數(shù)據(jù)分布方面非常有效,尤其適用于數(shù)據(jù)點密集的情況。它將數(shù)據(jù)空間劃分為六邊形單元格,單元格顏色表示其中數(shù)據(jù)點的數(shù)量,能清晰呈現(xiàn)數(shù)據(jù)的分布情況。
下面是使用Python和Matplotlib創(chuàng)建六邊形熱力圖的示例,展示空氣質(zhì)量指數(shù)(AQI)和醫(yī)院就診人數(shù)之間的相關(guān)性。
import numpy as np
import matplotlib.pyplot as plt
from mplhexbin import HexBin
# 模擬數(shù)據(jù)
np.random.seed(0) # 確保結(jié)果可復(fù)現(xiàn)
n_points = 10000
x = np.random.rand(n_points) * 100# 空氣質(zhì)量指數(shù)(AQI)取值范圍為0到100
y = 5 * np.sin(x * np.pi / 50) + np.random.randn(n_points) * 15# 模擬的醫(yī)院就診人數(shù),與AQI相關(guān)但存在噪聲
# 創(chuàng)建一個新的圖形
fig, ax = plt.subplots(figsize=(10, 8))
# 使用HexBin創(chuàng)建六邊形分箱圖
hb = HexBin(ax, gridsize=20, cmap='viridis', extent=[0, 100, -30, 50]) # 設(shè)置網(wǎng)格大小、顏色映射和范圍
hb.hexbin(x, y, mincnt=1) # 繪制六邊形分箱圖,mincnt設(shè)置最小計數(shù)閾值
# 添加標(biāo)題和軸標(biāo)簽
ax.set_title('空氣質(zhì)量指數(shù)(AQI)與醫(yī)院就診人數(shù)之間的關(guān)系')
ax.set_xlabel('空氣質(zhì)量指數(shù)(AQI)')
ax.set_ylabel('醫(yī)院就診人數(shù)')
# 顯示圖形
plt.colorbar(hb.cmap, ax=ax, label='數(shù)據(jù)點數(shù)量') # 添加顏色條并設(shè)置標(biāo)簽
plt.show()
圖片
4.?;鶊D
?;鶊D用于可視化數(shù)據(jù)流動,非常適合展示能源、材料和金融等領(lǐng)域的數(shù)據(jù)。
它以馬修·亨利·菲尼亞斯·里亞爾·桑基(Matthew Henry Phineas Riall Sankey)的名字命名,能展示系統(tǒng)各階段或各部分之間的流量。節(jié)點寬度與流量大小成正比,便于理解數(shù)據(jù)的規(guī)模和流向。
圖片
下面是使用Python創(chuàng)建?;鶊D的示例,展示從生產(chǎn)源頭到小城市消費者的能源流動情況。
import plotly.graph_objects as go
labels = ["煤炭", "太陽能", "風(fēng)能", "核能", "居民", "工業(yè)", "商業(yè)"]
source = [0, 1, 2, 3, 0, 1, 2, 3]
target = [4, 4, 4, 4, 5, 5, 5, 5]
value = [25, 10, 40, 20, 30, 15, 25, 35]
# 創(chuàng)建?;鶊D對象
fig = go.Figure(data=[go.Sankey(
node=dict(
pad=15,
thickness=20,
line=dict(color="black", width=0.5),
label=labels
),
link=dict(
source=source,
target=target,
value=value
))])
fig.update_layout(title_text="模范城市的能源流動", font_size=12)
fig.show()
圖片
5.流圖(主題河流圖)
流圖形似河流,用于描繪數(shù)據(jù)隨時間的變化。不同顏色區(qū)分不同類別,“河流”的寬度代表每個類別的數(shù)值大小。它以可視化的方式展示數(shù)據(jù)趨勢和關(guān)系,便于理解數(shù)據(jù)動態(tài)。
圖片
下面是用Altair庫創(chuàng)建流圖的示例。
import altair as alt
from vega_datasets import data
source = data.unemployment_across_industries.url
alt.Chart(source).mark_area().encode(
alt.X('yearmonth(date):T',
axis=alt.Axis(format='%Y', domain=False, tickSize=0)
),
alt.Y('sum(count):Q', stack='center', axis=None),
alt.Color('series:N',
scale=alt.Scale(scheme='category20b')
)
).interactive()
圖片