Ленточный график Matplotlib (fill_between) с категориальной осью X

У меня есть среднее и стандартное отклонение группы, и я хочу создать ленточный график со средним значением и затененный стандартным отклонением, однако у меня есть категориальные столбцы x_axis. Кажется, есть функция автосортировки, которая все отбрасывает.

## Environmental Variables
x_axis = ['Hematite','Illmenite','Goethite','Magnetite','Quartz','Gibbsite','1:1 Clay','Maghemite','Carbonate Minerals','Plagioclase','2:1 Clays','Dolomite','Pyroxene','Calcite','Olivine','Glass']

negative_means = numpy.array([0.14335727,0.05707763,-0.25710322,-0.31085691,0.45552229,0.0092398,0.33358032,-0.31261271,-0.34325373,-0.32826959,-0.22494553,-0.13867505,0.42883104,0.52948655, -0.13867505,0.52948655])

negative_std = numpy.array([0.9218578779912541,1.0417523903222377,0.7225001946958459,0.6634664468936872,1.8400873597252276,1.2279905419059247,1.3735242455660657,0.721879847038041,0.5543207488394122,0.7817647212788771,0.0,0.0,2.088217480513372,2.2160413265187904,0.0,2.216041326518791])


fig, ax = plt.subplots(1)

ax.plot(negative_means, lw=2, label='mean population 1', color='blue')
plt.fill_between(x_axis, negative_means+negative_std, negative_means-negative_std, facecolor='blue', alpha=0.5)

## Set x labels
ax.set_xticklabels(x_axis)
x_max = int(max(plt.xticks()[0]))
# manually set  xtick labels
plt.xticks(range(0, x_max + 1), x_axis, rotation=45) 

Результирующий график показан ниже: введите здесь описание изображения

Как я могу сформулировать свой график, чтобы он выглядел похожим на вопрос ниже с категориальной осью x.

Нарисуйте yerr/xerr как заштрихованную область, а не полосы ошибок< /а>

Когда я добавляю x_axis к функции ax.plot, создается результирующий график:

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


person Cody Glickman    schedule 18.09.2018    source источник
comment
Я думаю, вы забыли указать аргумент x для plot, ax.plot(x_axis, negative_means). Затем вы несете ответственность за сортировку значений самостоятельно, matplotlib просто отображает их в том порядке, в котором они ему заданы.   -  person ImportanceOfBeingErnest    schedule 18.09.2018
comment
Привет @ImportanceOfBeingErnest, спасибо, что указали на это. Когда я добавляю x_axis в качестве параметра, линия на графике также становится перекошенной. Я думаю, что та же самая автосортировка, с которой я имею дело с помощью set_xticklabels, происходит с информацией fill_between, и я понятия не имею, как это исправить.   -  person Cody Glickman    schedule 18.09.2018
comment
Извините, похоже, вы используете более старую версию matplotlib. Не могли бы вы просто обновиться до 2.2.2 или 2.2.3?   -  person ImportanceOfBeingErnest    schedule 18.09.2018
comment
Привет @ImportanceOfBeingErnest, я попробую! Я очень надеюсь, что это так! У меня был matplotlib 2.1.1:/   -  person Cody Glickman    schedule 18.09.2018
comment
Это сработало!! Уот! Спасибо @ImportanceOfBeingErnest!   -  person Cody Glickman    schedule 18.09.2018
comment
Преимущество в том, что теперь вы можете полностью исключить часть Set x labels, потому что matplotlib автоматически пометит категории за вас.   -  person ImportanceOfBeingErnest    schedule 18.09.2018
comment
Более подробное объяснение в этом ответе и ссылки в нем.   -  person ImportanceOfBeingErnest    schedule 18.09.2018


Ответы (1)


Я только что изменил параметр x для fill_between, используя range, который указывает значения x для ваших категориальных переменных. Остальные все было хорошо в вашем коде. Согласно официальной документации здесь, значение x должно быть cx-координаты, определяющие ваши кривые. Вы можете придерживаться того, чтобы не передавать x_axis при построении графика, что не лучший способ, как указано в комментарии @ImportanceOfBeingErnest выше.

plt.fill_between(range(len(x_axis)), negative_means+negative_std, negative_means-negative_std, facecolor='blue', alpha=0.3)
plt.tight_layout()

Вывод

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

person Sheldore    schedule 18.09.2018
comment
Привет @Bazingaa, спасибо за это! Я согласен с вами, что рекомендуется передавать переменную x_axis. Обновление моего matplotlib решило проблему. - person Cody Glickman; 18.09.2018
comment
Пожалуйста. Голосование за ваш вопрос в интересах проблемы, связанной с использованием более старой версии. - person Sheldore; 18.09.2018