如何在statsmodels镶嵌图中调整颜色和文本?

问题描述

我从Mosaic doc页的最后一个绘图中获得了以下代码

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.mosaicplot import mosaic

gender = ['male','male','female','female']
pet = ['cat','dog','cat','cat']
data = pd.DataFrame({'gender': gender,'pet': pet})
mosaic(data,['pet','gender'],gap=0.06,title='DataFrame')
plt.show()

但是,我希望该图的颜色在水平方向上是相同的,即在猫和狗类别中使用相同的颜色将雌性分组在一起。它也应适用于男性。我还想增加figsize并能够在图块中输入百分比比例。

我尝试了参数,但找不到解决方法

解决方法

可以通过标准的matplotlib方式设置figsize:fig,ax = plt.subplots(figsize=....))并将ax传递给mosaic()函数。

可以通过properties=参数更改颜色。此函数获取键作为输入(例如('cat','female')),并输出具有Rectangle属性的字典,例如facecolor,alpha,hatch,linestyle等。下面的示例将所有的猫染成绿色-蓝色,将所有的犬染成棕色。为了使男性和女性有所不同,可以将阴影线或Alpha设置为不同。

可以通过title=参数传递标题。该示例使用带有猫的百分比的f字符串。

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.mosaicplot import mosaic

gender = ['male','male','female','female']
pet = ['cat','dog','cat','cat']
third_col = [2,3,4,5,6,7]
data = pd.DataFrame({'gender': gender,'pet': pet,'third': third_col})

percent_cats = f"cats: {100 * len(data[data['pet'] == 'cat']) / len(data):.1f} %"
props = lambda key: {'color': 'turquoise' if 'cat' in key else 'sienna'}
fig,ax = plt.subplots(figsize=(12,4))
mosaic(data,['pet','gender'],gap=0.06,title=percent_cats,properties=props,ax=ax)
plt.show()

resulting plot

这是另一个示例,男性和女性使用不同的颜色,更改了使用的列的顺序,并使第一个布局方向变为水平。

percent_3rd_col = 100 * data[data['gender'] == 'female']['third'].sum() / data['third'].sum()
title = f"percent female: {percent_3rd_col:.1f} %"
props = lambda key: {'color': 'fuchsia' if 'female' in key else 'deepskyblue'}
mosaic(data,['gender','pet'],horizontal=False,title=title,ax=ax)

female colored equal