Matplotlib зменшує розмір шрифту галочок


299

Як на малюнку matplotlib я можу зробити розмір шрифту для міток галочок за допомогою ax1.set_xticklabels()менших?

Далі, як можна обертати його від горизонталі до вертикалі?


Дякую, що задали це запитання, я зараз намагаюся вирішити цю проблему. Я не переконаний у цьому, але схоже, що виборці вважають, що найкраща відповідь - це не прийнята. Як ти гадаєш?
Аарон Холл

я правильно прочитав, що в matplotlib існує принаймні 5 різних способів змінити розмір шрифту? : 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()

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


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(). (Чому це метод, я не маю підказки ... Матплотліб ненавидить властивості, мабуть!)
Джо Кінгтон,

@Joe: це вперше про мене is_last_row(), дякую! Я використовував plt.setpу минулому, і не обов'язково був впевнений, що це є більш канонічним способом налаштування галочок. Ви усунули це сумніви, дякую. Більш широко: ваші відповіді, особливо в matplotlibтезі, часто залишають мене з побоюванням. Продовжуйте велику роботу.
mechanical_meat

1
Дякую!! Я вдячний за добрі слова, особливо від вас! Канонічний в цьому випадку дуже відносний. plt.setpє "matlab-ism", і явний цикл, ймовірно, набагато пітонічніший. Будучи конвертором матлабу, я setpвідчуваю себе природним, але для кожного своїм. Будь-який із них досить читабельний, imo
Джо Кінгтон,

50
У нових версіях я виявив, що вам доведеться скористатися параметром мітки : наприкладax.tick_params(axis='x', labelsize=8)
Vladtn

Повинно бути get_ticklabelsНЕget_major_ticks
Їжак

505

Насправді існує простіший спосіб. Я щойно знайшов:

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частини вашого запитання.


2
Використовуйте axis = 'x'або axis = 'y'для зміни лише однієї з осей
loved.by. Ісус

221

Щоб одночасно вказати розмір шрифту та обертання, спробуйте:

plt.xticks(fontsize=14, rotation=90)

4
Зауважте, що це використовується під час роботи з MATLAB-подібним інтерфейсом pyplot. У разі об'єктно-орієнтованого інтерфейсу tick_params () метод осі об'єкта або метод set_tick_params () повинен застосовувати метод об'єкта осі (див. Інші відповіді).
вибух вогню

54

Крім того, ви можете просто зробити:

import matplotlib as mpl
label_size = 8
mpl.rcParams['xtick.labelsize'] = label_size 

36
plt.tick_params(axis='both', which='minor', labelsize=12)

Це єдина відповідь, яка працює, якщо ви хочете змінити розмір шрифтів без встановлення нових міток.
Девід Стансбі

@DavidStansby Я не вірю, що це правда. У мене була така точна проблема (згадана вище) і я міг використовувати альтернативний метод, відмінний від цього рішення. використовуючиax.xaxis.set_tick_params(labelsize=20)
Кайл Свонсон

1
найпростіша відповідь, не вимагає посилання на об’єкт сокири
jeremy_rutman

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').


1
Це змушує вас також вказати labels. Краще, якщо ми можемо змінити лише розмір шрифту.
Гімуте

16

Ви також можете змінити параметри відображення міток, наприклад розмір шрифту, таким чином:

zed = [tick.label.set_fontsize(14) for tick in ax.yaxis.get_major_ticks()]

1
Я думаю, що використання списків розуміння, які мають побічні ефекти, не є найкращою практикою. Я б запропонував замість цього використовувати стандарт для циклу.
jjmontes

14

Для меншого шрифту я використовую

ax1.set_xticklabels(xticklabels, fontsize=7)

і це працює!


як ви визначаєте xticklabels?
mLstudent33

10

Для мене працювало наступне:

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

Перевага перерахованого вище вам не потрібно , щоб забезпечити arrayвід labelsі роботи з будь-якими даними про axes.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.