问题描述
我从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()
这是另一个示例,男性和女性使用不同的颜色,更改了使用的列的顺序,并使第一个布局方向变为水平。
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)