Использование MaxNLocator для графика панд приводит к неправильным меткам - PullRequest
0 голосов
/ 06 мая 2018

У меня есть датафрейм для панд, и я хочу создать его сюжет:

import pandas as pd
from matplotlib.ticker import MultipleLocator, FormatStrFormatter, MaxNLocator
df = pd.DataFrame([1, 3, 3, 5, 10, 20, 11, 7, 2, 3, 1], range(-5, 6))
df.plot(kind='barh')

Хорошо, все работает как положено:

enter image description here

Теперь я хотел спрятать некоторые галочки по осям y. Глядя на документы , я думал, что смогу добиться этого с помощью:

MaxNLocator: Находит максимальное количество интервалов с галочками в хорошем местах. MultipleLocator: тики и диапазон кратны базе; целое число или число с плавающей запятой.

Но оба они изображают не то, что я ожидал увидеть (значения на осях Y не показывают правильные числа):

ax = df.plot(kind='barh')
ax.yaxis.set_major_locator(MultipleLocator(2))

enter image description here

ax = df.plot(kind='barh')
ax.yaxis.set_major_locator(MaxNLocator(3))

enter image description here


Что я делаю не так?

1 Ответ

0 голосов
/ 06 мая 2018

Задача

Проблема возникает из-за категоричности барпотов панд. Каждый столбец позиционируется с последовательным целочисленным значением, начинающимся с 0. Только метки корректируются для отображения фактического индекса кадра данных. Итак, здесь у вас есть FixedLocator со значениями 0,1,2,3,... и FixedFormatter со значениями -5, -4, -3, .... Смена локатора сама по себе не меняет форматер, поэтому вы получаете числа -5, -4, -3, ..., но в разных местах (один тик не отображается, поэтому график начинается здесь с -4).

A. Раствор панд

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

import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import (MultipleLocator, MaxNLocator, 
                                FuncFormatter, ScalarFormatter)

df = pd.DataFrame([1, 3, 3, 5, 10, 20, 11, 7, 2, 3, 1], range(-5, 6))

ax = df.plot(kind='barh')
ax.yaxis.set_major_locator(MultipleLocator(2))

sf = ScalarFormatter()
sf.create_dummy_axis()
sf.set_locs((df.index.max(), df.index.min()))

ax.yaxis.set_major_formatter(FuncFormatter(lambda x,p: sf(x+df.index[0])))


plt.show()

B. Матплотлиб раствор

Используя matplotlib, решение потенциально проще. Поскольку столбчатые диаграммы matplotlib имеют числовой характер, они располагают столбцы в местах, указанных для первого аргумента. Здесь достаточно установить только локатор.

import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import MultipleLocator, MaxNLocator

df = pd.DataFrame([1, 3, 3, 5, 10, 20, 11, 7, 2, 3, 1], range(-5, 6))

fig, ax = plt.subplots()
ax.barh(df.index, df.values[:,0])
ax.yaxis.set_major_locator(MultipleLocator(2))

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...