Как настроить цвет и текст на графике мозаики statsmodels?

#python #matplotlib #mosaic-plot

#python #matplotlib #mosaic-plot

Вопрос:

Я получил следующий код из последнего графика на странице документа 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()
  

Тем не менее, я бы хотел, чтобы цвет графика был одинаковым по горизонтали, т. Е. Группировка самок в категории cat и dog с одинаковым цветом. Это также должно применяться к мужскому типу. Я также хочу увеличить figsize и иметь возможность вводить процентную долю в плитке.

Я экспериментировал с параметрами, но не смог найти способ сделать это.

Ответ №1:

Размер figsize можно задать стандартным способом matplotlib: fig, ax = plt.subplots(figsize=....)) и передать ax mosaic() функции.

Цвет можно изменить с помощью properties= параметра. Это функция, которая получает ключ в качестве входных данных (например ('cat', 'female') ) и выводит словарь с Rectangle такими свойствами, как facecolor, alpha, штриховка, linestyle, … . В приведенном ниже примере все кошки окрашены в зелено-голубоватый цвет, а все собаки — в коричневый. Чтобы сделать разницу между мужским и женским, штриховка или альфа могут быть установлены по-разному.

Заголовок может быть передан через title= параметр. В примере используется f-строка с процентом cats.

 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)
  

женский цвет равен

Комментарии:

1. ЙоханК благодарит, что это сработало. мне было интересно, есть ли третий столбец с номером типа num=[2,3,4,5,6,7], есть ли способ включить это в качестве третьего столбца, который также будет иметь отдельный цвет, и доля этих значений num отображается в плитке?

2. Я обновил второй пример, чтобы вычислить процент через третий столбец.