的問題是,箱線圖組成,因爲seaborn包裹機構的許多不同的音樂人,我們不能簡單地將整個boxplot的zorder設置爲更高的數字。
第一次天真的嘗試將是設置swarmplot的zorder爲零。雖然這使得插圖背後的小插曲點也放在網格線後面。因此,如果沒有使用網格線,這個解決方案只是最優的。
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
# plot swarmplot
ax = sns.swarmplot(x="day", y="total_bill", data=tips, zorder=0)
# plot boxplot
sns.boxplot(x="day", y="total_bill", data=tips,
showcaps=False,boxprops={'facecolor':'None'},
showfliers=False,whiskerprops={'linewidth':0}, ax=ax)
plt.show()
如果網格線是期望的,我們可能將swarmplot的ZORDER設置爲1,使得其出現在網格線的上方,並且箱線圖的ZORDER設定爲高數字。如上所述,這需要將zorder屬性設置爲它的每個元素,因爲boxplot
調用中的zorder=10
不會影響所有藝術家。相反,我們需要使用boxprops
,whiskerprops
參數來爲這些參數設置zorder的合法性。
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
# plot swarmplot
ax = sns.swarmplot(x="day", y="total_bill", data=tips, zorder=1)
# plot boxplot
sns.boxplot(x="day", y="total_bill", data=tips,
showcaps=False,boxprops={'facecolor':'None', "zorder":10},
showfliers=False,whiskerprops={'linewidth':0, "zorder":10},
ax=ax, zorder=10)
plt.show()
的最終溶液,其可在完全沒有訪問被提供給藝術家性能一般情況下被施加是通過軸藝術家環並設置ZORDER爲他們取決於它們是否屬於這一個或另一個情節。
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
# plot swarmplot
ax = sns.swarmplot(x="day", y="total_bill", data=tips)
#get all children of axes
children1 = ax.get_children()
# plot boxplot
sns.boxplot(x="day", y="total_bill", data=tips,
showcaps=False,boxprops={'facecolor':'None'},
showfliers=False,whiskerprops={'linewidth':0}, ax=ax)
# again, get all children of axes.
children2 = ax.get_children()
# now those children which are in children2 but not in children1
# must be part of the boxplot. Set zorder high for those.
for child in children2:
if not child in children1:
child.set_zorder(10)
plt.show()
「問題是boxplot由許多不同的藝術家組成,由於seaborn包裝機制,我們無法直接訪問它們。」你無法訪問哪些藝術家? – mwaskom
我最初的意思是,對sns.boxplot的調用只返回一個座標軸而不是要使用的集合。我同意這是誤導,並會改變它。 – ImportanceOfBeingErnest