Matplotlib уменьшает размер шрифта для меток

299

На рисунке matplotlib, как я могу сделать размер шрифта для надписей галочкой ax1.set_xticklabels()меньшим?

Кроме того, как можно повернуть его из горизонтального в вертикальное положение?

Открой путь
источник
Спасибо за вопрос, я пытаюсь решить эту проблему прямо сейчас. У меня не так много мнений, но, похоже, избиратели считают, что лучший ответ - не принятый. Что вы думаете?
Аарон Холл
я правильно прочитал, что есть по крайней мере 5 различных способов изменить размер шрифта в matplotlib? : D
famargar

Ответы:

127

Обратите внимание, что в более новых версиях MPL есть ярлык для этой задачи. Пример показан в другом ответе на этот вопрос: https://stackoverflow.com/a/11386056/42346

Код ниже приведен для иллюстративных целей и не обязательно может быть оптимизирован.

import matplotlib.pyplot as plt
import numpy as np

def xticklabels_example():
    fig = plt.figure() 

    x = np.arange(20)
    y1 = np.cos(x)
    y2 = (x**2)
    y3 = (x**3)
    yn = (y1,y2,y3)
    COLORS = ('b','g','k')

    for i,y in enumerate(yn):
        ax = fig.add_subplot(len(yn),1,i+1)

        ax.plot(x, y, ls='solid', color=COLORS[i]) 

        if i != len(yn) - 1:
            # all but last 
            ax.set_xticklabels( () )
        else:
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(14) 
                # specify integer or one of preset strings, e.g.
                #tick.label.set_fontsize('x-small') 
                tick.label.set_rotation('vertical')

    fig.suptitle('Matplotlib xticklabels Example')
    plt.show()

if __name__ == '__main__':
    xticklabels_example()

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

mechanical_meat
источник
84
Также как в стороне: вместо того, чтобы перебирать объекты меток, вы можете использовать plt.setp. (Также посмотрите ax.tick_params) Например, вы можете просто сделать plt.setp(ax.get_xticklabels(), rotation='vertical', fontsize=14). Кроме того, у объектов осей есть ax.is_last_row()метод, который может быть полезен в случаях, подобных вашему примеру. Вместо if i != len..., вы можете сделать if not ax.is_last_row(). (Почему это метод, я понятия не имею ... Matplotlib ненавидит свойства, по-видимому!)
Джо Кингтон
@Joe: это мой первый раз слышу о is_last_row(), спасибо! Я использовал plt.setpв прошлом, и не обязательно был уверен, что он представляет собой более канонический способ настройки меток. Вы удалили это сомнение, спасибо. В более широком смысле: ваши ответы, особенно в matplotlibтеге, часто вызывают у меня страх. Продолжайте в том же духе.
mechanical_meat
1
Спасибо!! Я ценю добрые слова, особенно от вас! Канонический очень относителен в этом случае. plt.setpявляется "matlab-ism", и явный цикл, вероятно, гораздо более питонический. Будучи новообращенным матлабом, я себя setpчувствую естественно, но каждому свое. Любой из них вполне читабелен, IMO
Джо Кингтон
50
В новых версиях я обнаружил, что вам нужно использовать параметр labelize : например,ax.tick_params(axis='x', labelsize=8)
Vladtn
Должно быть get_ticklabelsнеget_major_ticks
Еж
506

Есть более простой способ на самом деле. Я только что нашел:

import matplotlib.pyplot as plt
# We prepare the plot  
fig, ax = plt.subplots()

# We change the fontsize of minor ticks label 
ax.tick_params(axis='both', which='major', labelsize=10)
ax.tick_params(axis='both', which='minor', labelsize=8)

Это только ответ на размер labelчасти вашего вопроса, хотя.

Autiwa
источник
2
Используйте axis = 'x'или axis = 'y'чтобы изменить только одну из осей
love.by.Iesus
221

Чтобы указать размер шрифта и поворот одновременно, попробуйте следующее:

plt.xticks(fontsize=14, rotation=90)
scottlittle
источник
4
Обратите внимание, что это используется при работе с MATLAB-подобным интерфейсом pyplot. В случае объектно-ориентированного интерфейса следует использовать метод tick_params () объекта оси или метод set_tick_params () объекта оси (см. Другие ответы).
wombatonfire
54

В качестве альтернативы, вы можете просто сделать:

import matplotlib as mpl
label_size = 8
mpl.rcParams['xtick.labelsize'] = label_size 
user2468932
источник
36
plt.tick_params(axis='both', which='minor', labelsize=12)
jingweimo
источник
Это единственный ответ, который работает, если вы хотите изменить размер шрифта без установки новых меток.
Дэвид
@DavidStansby Я не верю, что это правда. У меня была именно эта проблема (упомянуто выше), и я смог использовать альтернативный метод, отличный от этого решения. используяax.xaxis.set_tick_params(labelsize=20)
Кайл Свонсон
1
самый
26

Еще одна альтернатива

У меня есть два графика рядом, и я хотел бы настроить метки отдельно.

Вышеуказанные решения были близки, но они не помогли мне. Я нашел свое решение на этой странице matplotlib .

ax.xaxis.set_tick_params(labelsize=20)

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

т.е.

ax1.set_xticklabels(ax1_x, fontsize=15)
ax1.set_yticklabels(ax1_y, fontsize=15)

Таким образом, я использовал для правильного сюжета,

ax2.xaxis.set_tick_params(labelsize=24)
ax2.yaxis.set_tick_params(labelsize=24)

Небольшая тонкость ... Я знаю ... но я надеюсь, что это кому-то поможет :)

Бонусные баллы, если кто-нибудь знает, как настроить размер шрифта метки порядка величины.

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

Кайл Свонсон
источник
22

В текущих версиях Matplotlib вы можете это сделать axis.set_xticklabels(labels, fontsize='small').

Christoph
источник
1
Это заставляет вас указывать labelsтоже. Лучше, если мы сможем изменить только размер шрифта.
Гимут
16

Вы также можете изменить параметры отображения метки, например, размер шрифта, с помощью строки, подобной этой:

zed = [tick.label.set_fontsize(14) for tick in ax.yaxis.get_major_ticks()]
ATX_Bigfoot
источник
1
Я думаю, что использование списочных представлений, имеющих побочные эффекты, не лучшая практика. Я бы предложил вместо этого использовать стандартный цикл for.
jjmontes
14

Для меньшего шрифта я использую

ax1.set_xticklabels(xticklabels, fontsize=7)

и это работает!

Pengyao
источник
как вы определяете xticklabels?
mLstudent33
10

У меня сработало следующее:

ax2.xaxis.set_tick_params(labelsize=7)
ax2.yaxis.set_tick_params(labelsize=7)

Преимущество вышеперечисленного вам не нужно , чтобы обеспечить arrayот labelsи работы с любыми данными о axes.

Cryptoman
источник