繁体   English   中英

Seaborn FacetGrid与马赛克图

[英]Seaborn FacetGrid with mosaic plot

想要绘制使用Seaborn的马赛克地块的格FacetGrid和statsmodels' mosaic和不太使它。

示例数据集:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from statsmodels.graphics.mosaicplot import mosaic

index = [i for j in [[k] * 6 for k in range(4)] for i in j]
gender = ['male', 'male', 'male', 'female', 'female', 'female'] * 4
pet = np.random.choice(['cat', 'dog'], 24).tolist()
data = pd.DataFrame({'index': index, 'gender': gender, 'pet': pet})
data.head(10)
    index   gender  pet
0   0   male    dog
1   0   male    dog
2   0   male    cat
3   0   female  dog
4   0   female  dog
5   0   female  cat
6   1   male    cat
7   1   male    dog
8   1   male    dog
9   1   female  dog

我想制作一个2x2的网格,其中包含4个镶嵌图,每个镶嵌图用于列index的子集。

现在,说第一个组( index == 0 )的单个镶嵌图:

data0 = data[data['index'] == 0]

props = {}
for x in ['female', 'male']:
    for y, col in {'dog': 'red', 'cat': 'blue'}.items():
        props[(x, y)] ={'color': col}

mosaic(data0, ['gender', 'pet'],
       labelizer=lambda k: '',
       properties=props)
plt.show()

单马赛克

但是尝试将此镶嵌放在自定义函数sns.FacetGrid.map()可能会使用,但我失败了(这是一个版本,我尝试了几次):

def my_mosaic(sliced_data, **kwargs):
    mosaic(sliced_data, ['gender', 'pet'],
       labelizer=lambda k: '',
       properties=props)

g = sns.FacetGrid(data, col='index', col_wrap=2)
g = g.map(my_mosaic)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-323-a81a61aaeaff> in <module>()
      5 
      6 g = sns.FacetGrid(data, col='index', col_wrap=2)
----> 7 g = g.map(my_mosaic)

~\AppData\Local\Programs\Python\Python36-32\lib\site-packages\seaborn\axisgrid.py in map(self, func, *args, **kwargs)
    741 
    742             # Draw the plot
--> 743             self._facet_plot(func, ax, plot_args, kwargs)
    744 
    745         # Finalize the annotations and layout

~\AppData\Local\Programs\Python\Python36-32\lib\site-packages\seaborn\axisgrid.py in _facet_plot(self, func, ax, plot_args, plot_kwargs)
    825 
    826         # Draw the plot
--> 827         func(*plot_args, **plot_kwargs)
    828 
    829         # Sort out the supporting information

TypeError: my_mosaic() missing 1 required positional argument: 'sliced_data'

我阅读了文档和示例 ,但是我只是无法弄清楚如何从Seaborn或matplotlib.pyplot未内置的任何绘图函数(例如plt.scattersns.regplot )中创建可调用函数。

我发现当您最终要处理...数据帧时,使用map_dataframe()更容易。

def my_mosaic(*args,**kwargs):
    mosaic(kwargs['data'], list(args),
           labelizer=lambda k: '',
           properties=props,
           ax=plt.gca())

g = sns.FacetGrid(data, col='index', col_wrap=2)
g = g.map_dataframe(my_mosaic, 'gender', 'pet')

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM