Самодельная функция разброса, встроенная функция, дающая ax1 и ax2, если доступно - PullRequest
2 голосов
/ 12 июня 2019

У меня есть много функций разброса, которые можно построить с помощью matplotlib, либо по одной оси y, либо по двум осям y. Чтобы облегчить это, я создаю свою собственную функцию разброса: draw_scatter. Я указываю в аргументе, по какой оси Y я хочу построить данные.

Я также указываю fig_param, который указывает fig, ax1, ax2, а функция возвращает кортеж (fig, ax1, ax2), чтобы использовать те же элементы для следующего набора данных.

Мне не нравится иметь в аргументах ax1, ax2, но я не нахожу, как этого избежать. Есть ли встроенная функция, выдающая ax1 и ax2, если есть? Я мог бы назвать это в моей функции

У меня будет функция для указания x_label, легенды ... на рис.

Спасибо

import numpy as np
import matplotlib.pyplot as plt

def draw_scatter(fig_param, ax_selec, X, Y, **kwargs):
    """Draw a figure, scatter type, on one or two axis, with selection in argument 
       Input: fig_param(fig,ax1,ax2), ax2 is None if only one axis wanted, 
              simple array X, simple array Y, parameters dict 
       Output: (fig,ax1,ax2), in order to be used again for next elements to be drawn on the same figure""" 

    fig, ax1, ax2 = fig_param

    if kwargs.get('marker_color'):  
        marker_color = kwargs['marker_color']
    else:
        marker_color='k'        
    if kwargs.get('marker_size'): 
        marker_size = kwargs['marker_size']
    else:
        marker_size = 4    

    if ax_selec == 1:
        ax1.scatter(X, Y, color=marker_color, s=marker_size)     
    else:
       ax2.scatter(X, Y, color=marker_color, s=marker_size)       
    return (fig, ax1, ax2)  

x = np.arange(0, 10.0, 1)
y1 = 2*x
y2 = np.sin(x)

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()  # -Set to None if only one y axis is needed 

param = {'marker_color':'blue',
         'marker_size' : 20} 
result_fig = draw_scatter((fig,ax1,ax2), 1, x, y1,**param)

param = {'marker_color':'red'} 
result_fig = draw_scatter(result_fig, 2, x, y2, **param)

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

В качестве альтернативы глобализации, я думаю, я могу использовать внутри своей функции plt.gcf (). Axes

import numpy as np
import matplotlib.pyplot as plt

def draw_scatter(fig, ax_selec, X, Y, **kwargs):

    axes_list = plt.gcf().axes

    if kwargs.get('marker_color'): 
        marker_color = kwargs['marker_color']
    else:
        marker_color='k'        
    if kwargs.get('marker_size'):  
        marker_size = kwargs['marker_size']
    else:
        marker_size = 4    

    if ax_selec == 1:
        axes_list[0].scatter(X, Y, color=marker_color, s=marker_size)     
    else:
       axes_list[1].scatter(X, Y, color=marker_color, s=marker_size)       

x = np.arange(0, 10.0, 1)
y1 = 2*x
y2 = np.sin(x)

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()  # -Set to None if only one y axis is needed 

param = {'marker_color':'blue',
         'marker_size' : 20} 
draw_scatter(fig, 1, x, y1,**param)

param = {'marker_color':'red'} 
draw_scatter(fig, 2, x, y2, **param)
0 голосов
/ 12 июня 2019

Хорошо, если вы не объявите некоторые ax1 и ax2 и fig в качестве некоторых локальных переменных внутри области действия функции, изменения и обновления будут применены к глобальным переменным.

Как говорится, в вашем текущем примере вам не нужно передавать ax1, ax2, fig в вашу функцию.Прочитайте это , чтобы получить более полное представление о глобальных переменных.

def draw_scatter(ax_selec, X, Y, **kwargs):
    if kwargs.get('marker_color'):  # Il faudrait pouvoir supprimer ou activé tickle sur le x. prevoir un else 
        marker_color = kwargs['marker_color']
    else:
        marker_color='k'        
    if kwargs.get('marker_size'):  # Il faudrait pouvoir supprimer ou activé tickle sur le x. prevoir un else 
        marker_size = kwargs['marker_size']
    else:
        marker_size = 4    

    if ax_selec == 1:
        ax1.scatter(X, Y, color=marker_color, s=marker_size)     
    else:
        ax2.scatter(X, Y, color=marker_color, s=marker_size)       
    return (fig, ax1, ax2)  

x = np.arange(0, 10.0, 1)
y1 = 2*x
y2 = np.sin(x)

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()  # -Set to None if only one y axis is needed 

param = {'marker_color':'blue',
         'marker_size' : 20} 
result_fig = draw_scatter( 1, x, y1,**param)

param = {'marker_color':'red'} 
result_fig = draw_scatter(2, x, y2, **param)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...