Как установить xticks и свойства шрифта для сюжетов pyplot? - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь отобразить частоты использования эмодзи в различных типах твитов («нормальных» твитах, ретвитах и ​​ответах).Для этой цели я использую шрифт TwitterColorEmoji-SVGinOT ( link ), чтобы визуализировать Юникод эмодзи, который я поместил в качестве меток xticks с plt.xticks () .Тем не менее, он правильно устанавливает символы только для последнего подзаговора (см. Рисунок ниже).

Как я могу сделать то же самое для всех подзаговоров?

Это код, который яиспользуется для создания участков.

import matplotlib.font_manager as fm
from matplotlib import ft2font
from matplotlib.font_manager import ttfFontProperty

def print_emoji_freq(emoji_freqs, ax, fontprop):

    emojis = list(zip(*emoji_freqs))[0]
    scores = list(zip(*emoji_freqs))[1]
    x_pos = np.arange(len(emojis))

    ax.bar(x_pos, scores, align='center')
    plt.xticks(x_pos, emojis, fontproperties=fontprop)

    ax.set_xticks(x_pos)
    ax.set_ylabel('Popularity Score')

fpath = '/home/mattia/.local/share/fonts/TwitterColorEmoji-SVGinOT.ttf'
fprop = fm.FontProperties(fname=fpath)

font = ft2font.FT2Font(fpath)
fprop = fm.FontProperties(fname=fpath)

ttfFontProp = ttfFontProperty(font)

fontprop = fm.FontProperties(family='sans-serif',
                            fname=ttfFontProp.fname,
                            size=25,
                            stretch=ttfFontProp.stretch,
                            style=ttfFontProp.style,
                            variant=ttfFontProp.variant,
                            weight=ttfFontProp.weight)

fig, ax = plt.subplots(1, 3, figsize=(18,4))

print_emoji_freq(st_emojis, ax[0], fontprop)
print_emoji_freq(rt_emojis, ax[1], fontprop)
print_emoji_freq(rp_emojis, ax[2], fontprop)

plt.show()

result

Заранее спасибо.

Решение Спасибо@cheersmate, @ ImportanceOfBeingErnest за их полезное предложение.Действительно, используя функции ax.set_xticks () и ax.set_xticklabels () я могу получить желаемый результат.

Это обновленный метод:

def print_emoji_freq(emoji_freqs, ax, fontprop):

    emojis = list(zip(*emoji_freqs))[0]
    scores = list(zip(*emoji_freqs))[1]
    x_pos = np.arange(len(emojis))

    ax.bar(x_pos, scores, align='center')

    ax.set_xticks(x_pos)
    ax.set_xticklabels(emojis, fontproperties=fontprop)

    ax.set_xticks(x_pos)

    ax.set_ylabel('Popularity Score')

и это конечный результат

results2

1 Ответ

0 голосов
/ 12 декабря 2018

Как предлагает ImportanceOfBeingErnest, вы не можете использовать plt.xticks(), поскольку они применяются к текущим осям (plt.gca()).Для этого вам необходимо использовать объект ax:

from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plt

def plot_function(ax):
    fm = FontProperties(weight='bold')
    ax.set_xticks([1, 3, 5])
    ax.set_xticklabels(['one', 'three', 'five'], fontproperties=fm)

fig, ax = plt.subplots(1, 3)

plot_function(ax[0])
plot_function(ax[1])
plot_function(ax[2])

enter image description here

...