簡體   English   中英

Seaborn - FacetGrid軸在行/ y軸上跨列共享x軸

[英]Seaborn - FacetGrid axes sharing x axis across rows / y-axis across columns

FacetGridseaborn創建subpots讓您探索您的數據集的條件關系的網格。

函數接受的兩個關鍵字參數是sharexsharey ,根據文檔:

分享{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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM