Arhn - архитектура программирования

Элегантное изменение цвета рамки графика в matplotlib

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

Изменение цвета всего кадра (отметок и осей) вокруг двойного графика (через add_subplot) с осями [ax1, ax2] приводит к большому количеству кода. Этот фрагмент изменяет цвет рамки верхнего графика:

ax1.spines['bottom'].set_color('green')
ax1.spines['top'].set_color('green')
ax1.spines['left'].set_color('green')
ax1.spines['right'].set_color('green')
for t in ax1.xaxis.get_ticklines(): t.set_color('green')
for t in ax1.yaxis.get_ticklines(): t.set_color('green')
for t in ax2.xaxis.get_ticklines(): t.set_color('green')
for t in ax2.yaxis.get_ticklines(): t.set_color('green')

Так что для изменения цвета рамки двух графиков с двумя осями Y на каждом мне понадобится 16 (!) Строк кода ... Вот как это выглядит:

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

Другие методы, которые я откопал до сих пор:

  • matplotlib.rc: обсуждается здесь; меняется глобально, а не локально. Я хочу, чтобы другие сюжеты были разных цветов. Пожалуйста, не обсуждайте слишком много цветов в графиках ... :-)

    matplotlib.rc('axes',edgecolor='green')
    
  • выкопайте шипы оси, затем измените ее: также обсуждается здесь; я думаю, не очень элегантно.

    for child in ax.get_children():
        if isinstance(child, matplotlib.spines.Spine):
            child.set_color('#dddddd')
    

Есть ли элегантный способ сжать вышеуказанный блок, что-то более "питоническое"?

Я использую python 2.6.5 с matplotlib 0.99.1.1 под ubuntu.

15.10.2011

Ответы:


1

Рефакторинг вашего кода выше:

import matplotlib.pyplot as plt

for ax, color in zip([ax1, ax2, ax3, ax4], ['green', 'green', 'blue', 'blue']):
    plt.setp(ax.spines.values(), color=color)
    plt.setp([ax.get_xticklines(), ax.get_yticklines()], color=color)
30.10.2011
  • Хороший. Пожалуйста, укажите два цвета, и я «приму» ваш ответ. (например: for ax, color in zip([ax1, ax2, ax3, ax4], ['green', 'green', 'blue', 'blue']): plt.setp(ax.spines.values(), color=color); plt.setp([ax.get_xticklines(), ax.get_yticklines()], color=color)) 30.10.2011
  • в вашей последней строке, я думаю, вы имели в виду ax1 быть просто ax 01.03.2016
  • Да, действительно, @Joel. :) Исправил сейчас (спустя более 4 лет). 01.03.2016
  • К вашему сведению, ax.spines.values() не будет работать в Py3, поскольку plt.setp принимает только индексируемый объект. Значения словаря повторяются, но не индексируются в Py3. Я работаю над PR, чтобы исправить это для потомков (я имею в виду заставить setp принимать любые итерации, а не исправлять values() в Py3). 22.03.2016
  • @MadPhysicist Спасибо, да, сейчас я просто использую tuple(ax.spines.values()), чтобы изменить их цвета с помощью plt.setp. Было бы действительно полезно, если бы это работало для произвольных итераций. 28.04.2017

  • 2

    Предполагая, что вы используете достаточно последнюю версию matplotlib (> = 1.0), возможно, попробуйте что-то вроде этого:

    import matplotlib.pyplot as plt
    
    # Make the plot...
    fig, axes = plt.subplots(nrows=2)
    axes[0].plot(range(10), 'r-')
    axes[1].plot(range(10), 'bo-')
    
    # Set the borders to a given color...
    for ax in axes:
        ax.tick_params(color='green', labelcolor='green')
        for spine in ax.spines.values():
            spine.set_edgecolor('green')
    
    plt.show()
    

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

    15.10.2011
  • Я запускаю matplotlib 0.99.1.1 (Ооо!). Также я не очень хорошо объяснил двойной сюжет. Я обновил первоначальный вопрос и добавил графику. Вы показали еще одну возможность раскраски осей, которую я могу добавить в свой список (при использовании последней версии m.p.l.). Будет ли ваш по-прежнему короче, если вы раскрасите рамку с двумя осями Y на одном графике? 16.10.2011

  • 3

    Может быть, было бы немного грубо отвечать на мой собственный вопрос, но я хотел бы поделиться тем, что я смог найти на данный момент. Эта версия может раскрашивать два подзаголовка с осями [ax1, ax2] и [ax3, ax4] в два разных цвета. Это намного короче, чем 16 строк, которые я указал в своем вопросе выше. Он вдохновлен ответом Джо Кингтона здесь и в твинкс убивает цвет метки тика.

    import matplotlib.pyplot as plt
    import numpy as np
    
    # Generate some data
    num = 200
    x = np.linspace(501, 1200, num)
    yellow_data, green_data , blue_data= np.random.random((3,num))
    green_data += np.linspace(0, 3, yellow_data.size)/2
    blue_data += np.linspace(0, 3, yellow_data.size)/2
    
    fig = plt.figure()
    plt.subplot(211) # Upper Plot
    ax1 = fig.add_subplot(211)
    ax1.fill_between(x, 0, yellow_data, color='yellow')
    ax2 = ax1.twinx()
    ax2.plot(x, green_data, 'green')
    plt.setp(plt.gca(), xticklabels=[])
    plt.subplot(212) # Lower Plot
    ax3 = fig.add_subplot(212)
    ax3.fill_between(x, 0, yellow_data, color='yellow')
    ax4 = ax3.twinx()
    ax4.plot(x, blue_data, 'blue')
    
    # Start coloring
    for ax, color in zip([ax1, ax2, ax3, ax4], ['green', 'green', 'blue', 'blue']):
        for ticks in ax.xaxis.get_ticklines() + ax.yaxis.get_ticklines():
            ticks.set_color(color)
        for pos in ['top', 'bottom', 'right', 'left']:
            ax.spines[pos].set_edgecolor(color)
    # End coloring
    
    plt.show()
    

    color_plots

    Я пометил его как принятый, поскольку это самое компактное решение, которое я смог найти на данный момент. Тем не менее, я открыт для других, возможно, более элегантных способов решения этой проблемы.

    23.10.2011
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..