1

我从Mosaic 文档页面的最后一个图中得到了以下代码:

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并能够在磁贴中输入百分比。

我尝试了这些参数,但找不到方法。

4

1 回答 1

0

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

颜色可以通过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', '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)

女性有色人种

于 2020-10-10T19:51:45.270 回答