Как мне отобразить строковые значения на графике вместо промежуточных, используя некоторый график гистограммы Сиборна?

#python #pandas #dataframe #type-conversion #seaborn

#python #панды #фрейм данных #преобразование типов #сиборн

Вопрос:

Я пытаюсь создать гистограмму участников мужского и женского пола из фрейма данных. В настоящее время целочисленные значения представляют каждый пол, но я хочу, чтобы на графике отображалось строковое значение, которое целое число представляет на оси. Мой текущий код выглядит следующим образом.

 # Investigating the gender of participants

# 1 = male, 2 = female

data.Gender = data.Gender.astype(str)
data.Gender[data.Gender == '1'] = 'male'
data.Gender[data.Gender == '2'] = 'female'

genderPlot = sns.histplot(data.Gender, bins=2, discrete=True);
 

Есть ли более простой способ сделать это без необходимости преобразования данных? Кроме того, есть ли более чистый способ преобразования данных из целого числа в строку или даже мужскую и женскую категории?

Ответ №1:

Отредактировано:

Я предполагаю, что это тот результат, который вы хотите, без замены самих данных, просто изменив метки на графике:

 genderPlot = sns.histplot(data['Gender'], bins=2, discrete=True);
genderPlot.set_xticks(data['Gender'].unique())
genderPlot.set_xticklabels(['male', 'female']);
 

введите описание изображения здесь

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

1. Я получаю следующую ошибку AttributeError: объект ‘PolyCollection’ не имеет свойства ‘xticklabels’

2. Спасибо! Это именно то, что я хотел. Я только что нашел set_xticklabels и собирался его протестировать.

Ответ №2:

Другой ответ узко решает проблему, но я бы упомянул, что изменение меток таким образом немного рискованно, потому что ваш код предполагает, что столбцы расположены в определенном порядке, и это может быть не всегда верно. С числами, закодированными в виде строк, столбики будут отображаться в том порядке, в котором уникальные значения отображаются в наборе данных, поэтому, если ваши данные немного изменятся, вы можете получить неверный график.

Безопаснее попытаться выполнить это сопоставление программно. Если вы не хотите изменять исходный набор данных, вы можете преобразовать значения по мере их передачи в seaborn:

 gender_map = {"1": "male", "2": "female"}
sns.histplot(data['Gender'].map(gender_map))
 

(В качестве дополнительного примечания вам не нужно указывать количество ячеек discrete=True , и передача строковых данных будет подразумевать discrete=True , что вы можете оставить это и здесь).

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

1. Спасибо. Это хороший момент и то, с чем мне уже приходилось сталкиваться, очень полезно!