如何调整 statsmodels 马赛克图中的颜色和文本?

How to adjust color and text in a statsmodels mosaic plot?

我从 Mosaic doc 页面的最后一个情节中得到以下代码:

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

gender = ['male', 'male', 'male', 'female', 'female', 'female']
pet = ['cat', 'dog', 'dog', 'cat', 'dog', '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 等)的字典的函数。下面的示例将所有猫 green-blueish 和所有狗着色为棕色。要区分男性和女性,可以设置不同的影线或 alpha。

标题可以通过title=参数传递。该示例使用 f-string 和猫的百分比。

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

gender = ['male', 'male', 'male', 'female', 'female', 'female']
pet = ['cat', 'dog', 'dog', 'cat', 'dog', '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()

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

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, gap=0.06, title=title, properties=props, ax=ax)