[英]Seaborn - FacetGrid axes sharing x axis across rows / y-axis across columns
FacetGrid
從seaborn
創建subpots讓您探索您的數據集的條件關系的網格。
函數接受的兩個關鍵字參數是sharex
和sharey
,根據文檔:
分享{x,y} :bool,可選
如果為true,則facet將跨行跨越列和/或x軸共享y軸。
但我沒有看到任何其他方法來控制facets / subplots共享軸的方式。 所以這里......
有沒有辦法跨行和/或y軸跨行共享x軸?
我正在嘗試獲得不同條件(列和色調)的不同數量(行數)的密度圖。 因此,我希望我的子圖可以跨行共享x軸和y軸,但不會跨列鏈接。
它沒有正確記錄,但這些參數直接傳遞給plt.subplots
,它允許您將這些參數的值設置為"row"
或"col"
以便軸只在行或列中共享,而不是在整個行中共享網格。
我不確定我到底想要你的情節看起來如何,但我認為你可以這樣做:
tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="smoker", row="time", sharey="col")
g.map(plt.hist, "total_bill")
也就是說,一般情況下,我會嘗試在網格上共享軸(即,構建繪圖以跨行而不是跨列共享y軸)以簡化視覺比較。
FacetGrid
對象包含一組軸(網格形狀的numpy數組)。 您可以在陣列中的每個軸上手動設置軸限制。 但這需要大量的迭代/后處理。 以下是一個簡單的例子。
import pandas as pd
import seaborn as sns
import numpy as np
from matplotlib import pyplot as plt
data = pd.DataFrame({'a':np.random.random(1000),
'b':np.random.random(1000),
'c':np.random.random_integers(0,3,1000),
'x':np.random.random_integers(1,5,1000),
'y':np.random.random_integers(1,5,1000)})
g = sns.FacetGrid(data=data, col='x', row='y', hue='c', sharex=False, sharey=False)
g.map(plt.scatter, 'a', 'b').add_legend()
for axlist in g.axes:
for ax in axlist:
ax.set_ylim(.2,.3)
break
print(type(g.axes))
plt.show()
但是,如果你不介意跳過seaborn
並直接在工作matplotlib
,您可以用工作GridSpec
對象,而不是FacetGrid,如示例看到這里 。 然后,您可以具體指定共享哪些軸。
import pandas as pd
import seaborn as sns
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import gridspec
data = pd.DataFrame({'a':np.random.random(1000),
'b':np.random.random(1000),
'c':np.random.random_integers(0,3,1000),
'x':np.random.random_integers(1,5,1000),
'y':np.random.random_integers(1,5,1000)})
colors = ['b', 'r', 'g', 'y']
fig = plt.figure(figsize=(6,6))
gs = gridspec.GridSpec(len(data['x'].unique()),len(data['y'].unique()))
g = data.groupby(['x','y'])
for i, (ind, grp) in enumerate(g):
if i % 5 == 0:
ax = fig.add_subplot(gs[i])
else:
ax2 = fig.add_subplot(gs[i], sharex = ax)
plt.setp(ax2.get_yticklabels(), visible=False)
subgroups = grp.groupby('c')
for index, sub in subgroups:
plt.scatter(sub['a'], sub['b'], color=colors[index])
plt.show()
在這個例子中,我們跨行共享x軸(每個i % 5 == 0
)。 由於GridSpec對象只是一個numpy軸的數組,我們可以按任何方便的順序初始化它們並按照我們的意願共享軸。 使用GridSpec
,您可以進行更多自定義,但是必須手動編碼seaborn
(hue等)的很多部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.