简体   繁体   English

使用 matplotlib 获取绘图

[英]Getting plot using matplotlib

def get_plot(x_plot, y_plot, column_span, title, x_axis_1, y_axis_1,
            x_axis_2 = None, x_axis_3 = None,
            y_axis_2 = None, y_axis_3 = None,
            label_1 = None, label_2 = None, label_3 = None):
    ax[x_plot][y_plot] = plt.subplot2grid((3, 3), (x_plot, y_plot), colspan = column_span)
    if label_1 is None:
        ax[x_plot][y_plot].plot(x_axis_1, y_axis_1, linewidth = 2, color = ([0.37, 0.23, 0.37]), marker = 'o')
    else:
        ax[x_plot][y_plot].plot(x_axis_1, y_axis_1, linewidth = 2, color = ([0.37, 0.23, 0.37]), label = label_1, marker = 'o')

    if x_axis_2 is not None and  y_axis_2 is not None and label_2 is not None:
        ax[x_plot][y_plot].plot(x_axis_2, y_axis_2, linewidth = 2, color = ([0.44, 0.64, 0.69]), label = label_2, marker = 'o')
        if title == ' sterillite' or title == 'Fennel seeds':
            ax[x_plot][y_plot].set_ylim(0, 100)
        ax[x_plot][y_plot].legend()

    if x_axis_3 is not None and  y_axis_3 is not None and label_3 is not None:
        ax[x_plot][y_plot].plot(x_axis_3, y_axis_3, linewidth = 2, color = ([0.68, 0.74, 0.22]), label = label_3, marker = 'o')
        ax[x_plot][y_plot].legend()

    ax[x_plot][y_plot].set_xlim(xmin = 0.0)
    ax[x_plot][y_plot].yaxis.set_tick_params(labelsize = 8)
    ax[x_plot][y_plot].xaxis.set_tick_params(labelsize = 8)
    ax[x_plot][y_plot].set_axisbelow(True)
    ax[x_plot][y_plot].yaxis.grid(True)
    ax[x_plot][y_plot].xaxis.grid(False)
    ax[x_plot][y_plot].yaxis.set_major_formatter(FuncFormatter(format_y_tick_suffix))
    ax[x_plot][y_plot].set_title(title, fontsize = 10, fontweight = "bold")

The above code is working but it is way too much complex to understand.上面的代码可以工作,但它太复杂了,无法理解。 Can someone suggest me an alternate way of writing it?有人可以建议我另一种写作方式吗? I am new to the python can someone please help.我是python的新手,有人可以帮忙吗。

Just two suggestions:只有两个建议:

Use a variable to hold ax[x_plot][y_plot] , so you don't need to repeat that everytime.使用一个变量来保存ax[x_plot][y_plot] ,所以你不需要每次都重复。 eg::例如::

a = ax[x_plot][y_plot] = plt.subplot2grid((3, 3), (x_plot, y_plot), colspan = column_span)
a.plot(...)
#etc.

Instead of x_axis_1 , and so on, make a structure to hold plot data and give it as list:而不是x_axis_1等,创建一个结构来保存绘图数据并将其作为列表提供:

from collections import namedtuple
PlotData = namedtuple('PlotData', 'x_axis y_axis label color')

# ...

plotdata_list = [Plotdata(x1, y1, label1, color21), ...]
get_plot(x_axis, y_axis, column_span, title, plotdata_list)

... and use a loop to make the plots. ...并使用循环来绘制图。

Code (untested):代码(未经测试):

def get_plot(x_plot, y_plot, column_span, title, plotdata_list):
    a = ax[x_plot][y_plot] = plt.subplot2grid((3, 3), (x_plot, y_plot), colspan = column_span)

    for data in plotdata_list:
        kwargs = {}
        if data.label:
            kwargs['label'] = data.label
        a.plot(data.x_axis, data.y_axis, linewidth=2, color=data.color, marker='o', **kwargs)

    if len(plotdata_list) > 1:
        if title == ' sterillite' or title == 'Fennel seeds':
            a.set_ylim(0, 100)
        a.legend()

    a.set_xlim(xmin = 0.0)
    a.yaxis.set_tick_params(labelsize = 8)
    a.xaxis.set_tick_params(labelsize = 8)
    a.set_axisbelow(True)
    a.yaxis.grid(True)
    a.xaxis.grid(False)
    a.yaxis.set_major_formatter(FuncFormatter(format_y_tick_suffix))
    a.set_title(title, fontsize = 10, fontweight = "bold")

Call like this (following your comment):像这样打电话(按照您的评论):

get_plot(0, 0, column_span=2, title='hp_accessories', 
        plotdata_list=[
            # arguments: x, y, label, color
            PlotData(hp_laser_ts, hp_laser, 'Lasers', [0.37, 0.23, 0.37]),
            PlotData(hp_keyboard_ts, hp_keyboard, 'Keyboards', [0.44, 0.64, 0.69]),
            PlotData(hp_mouse_ts, hp_mouse, 'Mice', [0.68, 0.64, 0.22]),
        ]
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM