Показывать yticks только в пределах выбранного xlim - PullRequest
0 голосов
/ 27 марта 2020

Я хотел бы, чтобы t ie от оси Y до xlim показывал только тики, попадающие в выбранный xlim (т. Е. Ось Y должна включать только тики с синими полосами, а другие тики убирать с пробелами). ценности). Изображение прилагается. Включая полный код для репликации. Спасибо

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import string

k = 5
N = 100

users = pd.DataFrame({'freq' : np.random.randint(k, k + 100 , size=N),
              'id' : pd.Series(random.choice(string.ascii_uppercase) for _ in range(N)) })


fig, ax = plt.subplots()
ax.barh(users.id, users.freq)
labels = ax.get_xticklabels()
plt.setp(labels, rotation = 45, horizontalalignment = 'right')
ax.set(xlim = [90, 100], xlabel = 'Frequency', ylabel = 'ID',
title = 'Match')
ax.get_yticks()
ax.legend(labels = ('Match'), loc = 'upper right')

Изображение: показывать только йтики по отношению к xlim, удалить остальные

image

1 Ответ

0 голосов
/ 27 марта 2020

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

Чтобы получить всех пользователей с частотой не менее 90, используйте

grouped_users.loc[grouped_users.freq >= 90]

Чтобы также ограничить максимум, необходимы логические значения и (&) и скобки:

grouped_users.loc[(grouped_users.freq >= 90) & (grouped_users.freq <= 100)]

Некоторый демонстрационный код для сравнения с исходным сюжетом:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import string

np.random.seed(12345)
k = 5
N = 100
users = pd.DataFrame({'freq': np.random.randint(k, k + 100, size=N),
                      'id': np.random.choice(list(string.ascii_uppercase), N)})
x0 = 90
x1 = 100
grouped_users = users.groupby('id')[['id', 'freq']].sum()
grouped_users_filtered = grouped_users.loc[grouped_users.freq >= x0]

fig, (ax0, ax1) = plt.subplots(ncols=2)
ax0.barh(users.id, users.freq)
ax1.barh(grouped_users_filtered.index, grouped_users_filtered.freq)

for ax in (ax0, ax1):
    ax.set(xlim=[x0, x1], xlabel='Frequency', ylabel='ID', title='Match')
plt.show()

result

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