xlabel для первого субплота всплывающего списка - PullRequest
0 голосов
/ 21 ноября 2018

Я новичок в matplotlib и пытаюсь построить две гистограммы.Для второго графика xlabels хороши, но для первого графика я получил xlabels в виде списка, который также имеет формат строки Unicode.Вот мой код:

def get_val_from_dict(objects, n):
    x = []
    y = []

    for k,v in objects.items():
        probalities = float(v)/n
        cat = k 
        x.append(cat)
        y.append(probalities)

    return x,y

мои x, y списки имеют следующий формат для двух файлов данных:

[u'fast_food', u'school', u'bar', u'beauty', u'hairdresser', u'park', u'hotel', u'kiosk', u'pub', u'nightclub', u'supermarket', u'restaurant', u'bakery', u'pharmacy', u'doctors', u'fitness_centre', u'cafe', u'bank', u'clothes']
[0.08, 0.03, 0.03, 0.01, 0.05, 0.03, 0.19, 0.12, 0.04, 0.01, 0.01, 0.25, 0.03, 0.01, 0.02, 0.02, 0.05, 0.01, 0.02]
[u'fast_food', u'school', u'bar', u'jewelry', u'beauty', u'hairdresser', u'shoes', u'park', u'museum', u'restaurant', u'kiosk', u'supermarket', u'pharmacy', u'bakery', u'greengrocer', u'cafe', u'bank', u'clothes']
[0.03, 0.03, 0.03, 0.03, 0.03, 0.15, 0.03, 0.09, 0.03, 0.21, 0.06, 0.03, 0.03, 0.06, 0.03, 0.06, 0.06, 0.03]




x_all = []
y_all = []
name_ = []

for arg in sys.argv[1:]:
    reload(sys)
    sys.setdefaultencoding('utf-8')
    fp = open(arg)
    contents = fp.read()
    name = arg

    n, data =  subsamples(contents)
    x, y = get_val_from_dict(data, n)

    x_all.append(x)
    y_all.append(y)
    name_.append(name)


count=0
for i in range(len(x_all)):
    count += 1

f, axarr = plt.subplots(count, sharex='col',   sharey='row')

for i in range(len(x_all)):
    axarr[i].set_title(label ="%s" %(name_[i]))

    axarr[i].bar(x_all[i], y_all[i])
    axarr[i].tick_params(axis='both', which='both')

    axarr[i].set_xlabel(x)
    axarr[i].set_xticklabels(x_all[i], rotation=90)

plt.show()

Как я могу построить первый подзаговор, как показано ниже?

enter image description here

1 Ответ

0 голосов
/ 21 ноября 2018

Обычно, поскольку вы используете sharex, вы не ожидаете никаких меток под первым гистограммой.Итак, вы видите список, установленный axarr[i].set_xlabel(x).Теперь x на самом деле не используется в этом месте в коде;это список, который вы получаете через x, y = get_val_from_dict(data, n).Я предполагаю, что вы просто хотите удалить строку axarr[i].set_xlabel(x) из своего кода или заменить ее чем-нибудь более полезным,

axarr[i].set_xlabel("My cool categories")

Обратите внимание, однако, что количество категорий отличается для обоих графиков, и, следовательно, у вас есть однабар без метки на первом участке.Так что я бы предпочел не делить оси здесь.

import matplotlib.pyplot as plt

x1 = [u'fast_food', u'school', u'bar', u'beauty', u'hairdresser', u'park', u'hotel', u'kiosk', u'pub', u'nightclub', u'supermarket', u'restaurant', u'bakery', u'pharmacy', u'doctors', u'fitness_centre', u'cafe', u'bank', u'clothes']
y1 = [0.08, 0.03, 0.03, 0.01, 0.05, 0.03, 0.19, 0.12, 0.04, 0.01, 0.01, 0.25, 0.03, 0.01, 0.02, 0.02, 0.05, 0.01, 0.02]
x2 = [u'fast_food', u'school', u'bar', u'jewelry', u'beauty', u'hairdresser', u'shoes', u'park', u'museum', u'restaurant', u'kiosk', u'supermarket', u'pharmacy', u'bakery', u'greengrocer', u'cafe', u'bank', u'clothes']
y2 = [0.03, 0.03, 0.03, 0.03, 0.03, 0.15, 0.03, 0.09, 0.03, 0.21, 0.06, 0.03, 0.03, 0.06, 0.03, 0.06, 0.06, 0.03]


x_all = [x1,x2]
y_all = [y1,y2]
name_ = ["A", "B"]

fig, axarr = plt.subplots(len(x_all), sharey='row')

for i in range(len(x_all)):
    axarr[i].set_title(label ="%s" %(name_[i]))

    axarr[i].bar(x_all[i], y_all[i])
    axarr[i].tick_params(axis='both', which='both')

    axarr[i].set_xlabel("My cool categories")
    axarr[i].set_xticklabels(x_all[i], rotation=90)

fig.tight_layout()
plt.show()

enter image description here

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