Обезьяна исправляет панд и matplotlib, чтобы удалить шипы для df.plot () - PullRequest
0 голосов
/ 01 февраля 2019

Вопрос:

Я пытаюсь понять концепцию исправления обезьян и в то же время создать функцию для создания идеального временного рядасюжет.Как включить в pandas следующие функции matplotlib pandas.DataFrame.plot () ?

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

complete code at the end of the question


Подробности:


Я думаю, что настройки по умолчанию в df.plot() довольно аккуратны, особенно если вы используете Jupyter Notebook с темной темой, такой как chesterish от dunovank :

df.plot default

И я бы хотел использовать его для максимально возможного анализа данных, но я бы хотелочень нравится удалять рамку (или то, что называется шипами), например:

df.plot no frames

Возможно, это идеальный сюжет временного ряда.Но df.plot() не имеет встроенного аргумента для этого.Самая близкая вещь, кажется, grid = False, но это забирает всю сетку за один проход:

enter image description here


ЧтоЯ пробовал


Я знаю, что могу обернуть фрагмент spine в функцию вместе с df.plot(), поэтому я получаю следующее:

Фрагмент 1:

def plotPerfect(df, spline):

    ax = df.plot()

    if not spline:
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        ax.spines['bottom'].set_visible(False)
        ax.spines['left'].set_visible(False)

    return(ax)

plotPerfect(df = df, spline = False)

Выход 1:

enter image description here

Но является ли это "лучший способ сделать это в отношении гибкости и удобочитаемости для будущих поправок?Или даже самое быстрое в отношении времени выполнения, если мы говорим о сотнях сюжетов?

Я знаю, как получить источник df.plot() , но все оттуда сбивает меня с толку.Так как сделать Я включил эти настройки в df.plot?И, возможно, подход обернутой функции так же хорош, как и исправление обезьян?


Фрагмент с полным кодом и примерами данных:


Воспроизвести пример100%, вставьте это в ячейку Jupyter Notebook с активированной chesterish theme:

# imports
import pandas as pd
import numpy as np
from jupyterthemes import jtplot

# Sample data
np.random.seed(123)
rows = 50
dfx = pd.DataFrame(np.random.randint(90,110,size=(rows, 1)), columns=['Variable Y'])
dfy = pd.DataFrame(np.random.randint(25,68,size=(rows, 1)), columns=[' Variable X'])
df = pd.concat([dfx,dfy], axis = 1)
jtplot.style()

# Plot with default settings
df.plot()

# Wrap df.plot() and matplotlib spine in a function
def plotPerfect(df, spline):

    ax = df.plot()

    if not spline:
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        ax.spines['bottom'].set_visible(False)
        ax.spines['left'].set_visible(False)

    return(ax)

# Plot the perfect time-series plot
plotPerfect(df = df, spline = False)

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Альтернативным решением другого ответа было бы использование plt.box(False) или ax.set_frame_on(False), оба из которых скрывают прямоугольный патч осей.

def plotPerfect(df, spline):
    ax = df.plot()

    if not spline:
        ax.set_frame_on(False)
        # plt.box(False)  # another possible option

    return ax

Обратите внимание, что set_frame_on(False) удаляет фон, делая его прозрачным, что может быть нежелательно

0 голосов
/ 01 февраля 2019

Это похоже на xyproblem .

Исправление обезьян (Y)

Вопрос требует, чтобы обезьяна исправляла функцию построения панд для добавления дополнительных функций.В этом случае это можно сделать, заменив функцию pandas.plotting._core.plot_frame на ее собственную версию.

import pandas as pd
import pandas.plotting._core
orginal = pandas.plotting._core.plot_frame

def myplot(*args, **kwargs):
    spline = kwargs.pop("spline", True)
    ax = orginal(*args, **kwargs)
    ax.set_frame_on(spline)
    ax.grid(not spline)
    ax.tick_params(left=spline, bottom=spline)
    return ax

pandas.plotting._core.plot_frame = myplot

Затем используйте ее как

df = pd.DataFrame([[0.1, 0.1], [0.9, 0.9]]).set_index(0)
df.plot()             ## Normal Plot
df.plot(spline=False) ## "Despined" Plot 

enter image description here

Обратите внимание, что если в блокноте Jupyter ячейка с исправлениями обезьян не может быть запущена более одного раза, в противном случае это приведет к рекурсии.

Стиль (X)

Вышесказанное довольно излишне для изменения стиля сюжета.Лучше использовать опции стиля matplotlib .

mystyle = {"axes.spines.left" : False,
           "axes.spines.right" : False,
           "axes.spines.bottom" : False,
           "axes.spines.top" : False,
           "axes.grid" : True,
           "xtick.bottom" : False,
           "ytick.left" : False,}

Затем, чтобы применить это к некоторым графикам в блокноте, используйте менеджер plt.style.context,

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame([[0.1, 0.1], [0.9, 0.9]]).set_index(0)

df.plot()             ## Normal Plot

with plt.style.context(mystyle):
    df.plot()         ## "Despined" Plot 

enter image description here

Или, если вы хотите применить этот стиль глобально, обновите rcParams.

plt.rcParams.update(mystyle)
0 голосов
/ 01 февраля 2019

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

def plotPerfect(df, spline):
    ax = df.plot()

    if not spline:
        for i in ['top', 'right', 'bottom', 'left']:
            ax.spines[i].set_visible(False)

    return(ax)

# Plot the perfect time-series plot
plotPerfect(df = df, spline = False) 

Если вы хотите скрыть все четыре шипа и не хотите указывать верхний, правый и т. Д. Вручную, вы можете сделать это более автоматизированным способом, как описано ниже.Первый позволяет выбрать, какие из них скрыть.

def plotPerfect(df, spline):
    ax = df.plot()

    if not spline:
        for i in ax.spines.values():
            i.set_visible(False)

    return(ax)
...