使用Python實(shí)現(xiàn)嵌套繪圖并為條形圖添加自定義標(biāo)注
論文繪圖時(shí)經(jīng)常需要多圖嵌套,正好最近繪圖用到了,記錄一下使用Python實(shí)現(xiàn)多圖嵌套的過程。
首先,實(shí)現(xiàn) Seaborn 分別繪制折線圖和柱狀圖。
'''繪制折線圖'''
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore", "use_inf_as_na")
# 獲取繪圖數(shù)據(jù)
df_fmri=sns.load_dataset("fmri")
# 繪制折線圖
sns.lineplot(data=df_fmri, x="timepoint", y="signal", hue="event")
# 創(chuàng)建繪圖數(shù)據(jù)
df_bar=df_fmri[['subject','signal']].groupby('subject',observed=True).agg('max').reset_index()
# 繪制條形圖
ax_bar=sns.barplot(
data=df_bar,
x="subject", y="signal",
palette='Set2',
)

接下來實(shí)現(xiàn)條形圖與折線圖的嵌套,核心是使用 inset_axes 函數(shù)創(chuàng)建一個(gè)新的軸,然后再繪制第二個(gè)圖時(shí)指定繪圖的軸為剛才新建的軸。
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import matplotlib.pyplot as plt
# 獲取繪圖數(shù)據(jù)
df_fmri = sns.load_dataset("fmri")
df_bar=df_fmri[['subject','signal']].groupby('subject',observed=True).agg('max').reset_index()
# 繪制折線圖
ax=sns.lineplot(data=df_fmri, x="timepoint", y="signal", hue="event")
plt.legend(loc='upper left')
# 使用 inset_axes 函數(shù)添加一個(gè)軸,用來顯示條形圖
ax_bar = inset_axes(
ax, # 父軸
width='40%', height='50%', # 新軸相對(duì)于父軸的長寬比例
loc='lower left', # 新軸的錨點(diǎn)相對(duì)于父軸的位置
bbox_to_anchor=(0.55,0.45,1,1), # 新軸的bbox
bbox_transform=ax.transAxes # bbox_to_anchor 的坐標(biāo)基準(zhǔn)
)
# 繪制條形圖
ax_bar=sns.barplot(
data=df_bar,
x="subject", y="signal",
palette='Set2',
ax=ax_bar
)
可以看到,右上角的條形圖顯得很擁擠,x軸標(biāo)注相互重疊比較嚴(yán)重,因此,考慮將條形圖由縱向變?yōu)闄M向,在 Seaborn 繪圖時(shí)交換 x 軸和 y 軸就能實(shí)現(xiàn)。此外,bar上方的空間也比較大,考慮將x軸的標(biāo)注標(biāo)注到bar上方,以進(jìn)一步節(jié)約空間。bar的標(biāo)注可以通過 ax.bar_label() 函數(shù)實(shí)現(xiàn),該函數(shù)不僅可以直接標(biāo)注每個(gè)bar的數(shù)值,也可以自定義要標(biāo)注的內(nèi)容和格式。修改后的代碼和結(jié)果圖如下:
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import matplotlib.pyplot as plt
# 準(zhǔn)備數(shù)據(jù)
df_fmri = sns.load_dataset("fmri")
df_bar=df_fmri[['subject','signal']].groupby('subject',observed=True).agg('max').reset_index()
# 繪制折線圖
ax=sns.lineplot(data=df_fmri, x="timepoint", y="signal", hue="event")
plt.legend(loc='upper left')
# 使用 inset_axes 函數(shù)添加一個(gè)軸,用來顯示條形圖
ax_bar = inset_axes(
ax, # 父軸
width='47%', height='52%', # 新軸相對(duì)于父軸的長寬比例
loc='lower left', # 新軸的錨點(diǎn)相對(duì)于父軸的位置
bbox_to_anchor=(0.5,0.44,1,1), # 新軸的bbox
bbox_transform=ax.transAxes # bbox_to_anchor 的坐標(biāo)基準(zhǔn)
)
# 繪制條形圖
ax_bar=sns.barplot(
data=df_bar,
# 交換 x 軸和 y 軸列名實(shí)現(xiàn)橫向條形圖
x="signal", y="subject",
palette='Set2',
ax=ax_bar
)
# 使用 sns 的 bar_label 函數(shù)為條形圖添加標(biāo)注
ax_bar.bar_label(
ax_bar.containers[0], # 條形圖的 BarContainer 對(duì)象
labels=df_bar['subject'], # 要標(biāo)注的labels,默認(rèn)為 bar 的數(shù)值,此處傳入自定義的label序列
label_type='edge', # 標(biāo)注顯示的位置,可選 edge 或 center
padding=2, # 標(biāo)注與bar之間的距離
# fmt='%.2f' # 標(biāo)注格式化字符串
fontsize=10 # 設(shè)置標(biāo)注的字體大小
)
# 為了避免標(biāo)注超出繪圖范圍,將x軸的繪圖范圍擴(kuò)大
plt.xlim(0,0.62)
# 隱藏左側(cè)y軸
ax_bar.yaxis.set_visible(False)
# 去除多余的軸線
sns.despine()
打完收工!
到此這篇關(guān)于使用Python實(shí)現(xiàn)嵌套繪圖并為條形圖添加自定義標(biāo)注的文章就介紹到這了,更多相關(guān)Python嵌套繪圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django表單提交后實(shí)現(xiàn)獲取相同name的不同value值
這篇文章主要介紹了Django表單提交后實(shí)現(xiàn)獲取相同name的不同value值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python數(shù)據(jù)分析之使用matplotlib繪制折線圖、柱狀圖和柱線混合圖
matplotlib是python的一個(gè)模塊,用于繪制各種圖形,今天介紹一下折線圖的繪制,下面這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)分析之使用matplotlib繪制折線圖、柱狀圖和柱線混合圖的相關(guān)資料,需要的朋友可以參考下2022-05-05
Django查詢數(shù)據(jù)庫的性能優(yōu)化示例代碼
這篇文章主要給大家介紹了關(guān)于Django查詢數(shù)據(jù)庫性能優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
Python實(shí)現(xiàn)拷貝多個(gè)文件到同一目錄的方法
這篇文章主要介紹了Python實(shí)現(xiàn)拷貝多個(gè)文件到同一目錄的方法,涉及Python針對(duì)文件與目錄的遍歷、復(fù)制等相關(guān)操作技巧,需要的朋友可以參考下2016-09-09

