Как использовать matplotlib kwargs для произвольного форматирования функций? - PullRequest
0 голосов
/ 28 ноября 2018

Я редактирую функцию для создания графиков даты, и в ней жестко заданы параметры форматирования.Я пытаюсь добавить функцию типа format_ax для краткости и гибкости.Я прочитал документацию по пользовательским стилям в matplotlib, но меня смущает, как или если вы можете инкапсулировать все нужные аргументы axis.set_xxx () в одну функцию, которую вы можете легко манипулировать и вызывать для нескольких пользовательскихПРОКЛАДКИ-функция.Прежде всего, я хочу знать: Могу ли я / как передать kwargs для ax.set?

В написанной мной функции уже есть kwargs для форматирования нужных цветов.Я попытался вытянуть соответствующие строки кода в его собственную функцию.Например:

def format_ax_nicely(ax, **kwargs):
       ax.set_ylim(bottom=ymin, top=ymax)

Но когда я позвонил format_ax_nicely в my_timeseries_function следующим образом: format_ax_nicely(ax, ymin=ymin, ymax=ymax) Я получил ошибку NameError: name 'ymin' is not defined.

Использование ax.set() - другой подходЯ подумал, но вы не можете устанавливать размеры, только определять пределы и значения и т. Д.

Я также попробовал метод определения функции , определенный здесь с def add_titlebox, но я все еще не был 'не в состоянии использовать kwargs.Я получил эту ошибку:

     File "C:\Users\ceres\code\improc\analysis\plot.py", line 390, in my_timeseries
       title(ax, title, size=20)

  TypeError: 'str' object is not callable

** edit: спасибо @TheImportanceOfBeingErnest за указание, почему эти ошибки произошли!

Это приблизительная структура моей функции:

def my_timeseries_function(lots of parameters, **kwargs, **plotargs):
     # set up filesaving destination
     # cleanup dataframe
     # set labels
     fig, ax = plt.subplots(figsize=figsize)
     hues = create_custom_color_values(df, cmap, **kwargs)
     ax.grid(color="k", linestyle="-", linewidth=0.05)
     for g in labels:
          # plot x,y with custom colors
     # roughly 15 lines of formatting functions like set_ylabel, ax.legend, 
     # xaxis.set_major_locator, tick_params, conditional set_ylim which 
     # would ideally be replaced by:
     format_ax_nicely(ax, **plotargs)

Цель этого вопроса - как получить функцию "форматирования", которую может вызывать my_timeseries.Тем не менее, поскольку я новичок, если это не рекомендуется пользователями matplotlib, то я вторично спрашиваю , является ли таблица стилей "лучше"? Кажется, что трудно настроить, так как таблица стилейчасть глобальной среды, но это также может быть возможным ответом на мою задачу: упростить стилизацию моих графиков.

Дополнительный фон Некоторые пакеты Seaborn обеспечивают гибкость, сохраняя все форматирование в пределахфункция.Я не могу использовать их пакет, потому что мне нужно раскрасить точки так, как они в настоящее время не могут достичь, и я также не могу создать зависимость от seaborn в пакете, в котором я работаю.

Соответствующие пакеты для моего класса:

import numpy as np
import pandas as pd
import geopandas as gp

import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.dates as mdates
import matplotlib.cm as cm
try:
    import geoplot
except BaseException:
    pass

1 Ответ

0 голосов
/ 28 ноября 2018

У меня проблема с пониманием, что именно вам нужно здесь.Я думаю, что подход к использованию функции, которая стилизует оси, не так уж и плох.

Возможно, напоминание: если переменная не определена, ее нельзя использовать.Отсюда и ошибка, которую вы получаете.Доступны следующие параметры:

  • Определить аргумент

    def format_ax_nicely(ax, ymin=0, ymax=1):
        ax.set_ylim(bottom=ymin, top=ymax)
    
  • Получить аргумент из ключевых слов

    def format_ax_nicely(ax, **kwargs):
        ax.set_ylim(bottom=kwargs.get("ymin", 0), top=kwargs.get("ymax", 1))
    
  • Что касается размера шрифта заголовка, то это будет

    ax.title.set_size(20)
    

Некоторые стиль параметры могут быть установлены глобально через rcParams .Они включают в себя шрифты, размеры, цвета, внешний вид галочек и т. Д. Однако границы сюжета не являются их частью.Вы можете использовать их в контексте для временного стиля, хотя

with plt.style.context(('my_style_sheet')):
    my_timeseries_function(lots of parameters, kwargs, plotargs)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...