Example #1
0
def make_plot_control_window(plotgui):
    """
    Create the plot control window (tick marks, axis labels, etc).

    This routine produces the plot control window wherein one sets the plot
    properties such as the axis labels and the title.

    Parameters
    ----------

        plotgui:   by assumption a matplotlib_user_interface object

    Returns
    -------

        None

    """
    matplotlib_line_list = ['-', '--', '-.', ':', None]
    matplotlib_line_name_list = ['solid', 'dashed', 'dashdot',
                                 'dotted', 'None']
    if plotgui.plot_control_window is not None:
        return
    plotgui.plot_control_window = Tk.Toplevel()
    plotgui.plot_control_window.title('Plot Parameters')
    outframe = Tk.Frame(plotgui.plot_control_window)
    outframe.pack(side=Tk.TOP)
    holder = Tk.Frame(outframe)
    holder.pack(side=Tk.LEFT)
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Plot Title:')
    label.pack(side=Tk.LEFT)
    plotgui.title_field = Tk.Entry(field1, width=20)
    plotgui.title_field.pack(side=Tk.LEFT)
    plotgui.title_field.insert(0, plotgui.title[plotgui.current_plot-1])
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='X Axis Label:')
    label.pack(side=Tk.LEFT)
    plotgui.xlabel_field = Tk.Entry(field1, width=20)
    plotgui.xlabel_field.pack(side=Tk.LEFT)
    plotgui.xlabel_field.insert(
        0, plotgui.xparameters[plotgui.current_plot-1]['label'])
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Y Axis Label:')
    label.pack(side=Tk.LEFT)
    plotgui.ylabel_field = Tk.Entry(field1, width=20)
    plotgui.ylabel_field.pack(side=Tk.LEFT)
    plotgui.ylabel_field.insert(
        0, plotgui.yparameters[plotgui.current_plot-1]['label'])
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='X Axis Minimum:')
    label.pack(side=Tk.LEFT)
    plotgui.xmin_field = Tk.Entry(field1, width=20)
    plotgui.xmin_field.pack(side=Tk.LEFT)
    if plotgui.xparameters[plotgui.current_plot-1]['hybridlog'] == 1:
        xlim = general_utilities.inverse_hybrid_transform(
            plotgui.xparameters[plotgui.current_plot-1]['minimum'])
        plotgui.xmin_field.insert(0, xlim)
    else:
        plotgui.xmin_field.insert(
            0, plotgui.xparameters[plotgui.current_plot-1]['minimum'])
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='X Axis Maximum:')
    label.pack(side=Tk.LEFT)
    plotgui.xmax_field = Tk.Entry(field1, width=20)
    plotgui.xmax_field.pack(side=Tk.LEFT)
    if plotgui.xparameters[plotgui.current_plot-1]['hybridlog'] == 1:
        xlim = general_utilities.inverse_hybrid_transform(
            plotgui.xparameters[plotgui.current_plot-1]['maximum'])
        plotgui.xmax_field.insert(0, xlim)
    else:
        plotgui.xmax_field.insert(
            0, plotgui.xparameters[plotgui.current_plot-1]['maximum'])
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Y Axis Minimum:')
    label.pack(side=Tk.LEFT)
    plotgui.ymin_field = Tk.Entry(field1, width=20)
    plotgui.ymin_field.pack(side=Tk.LEFT)
    if plotgui.yparameters[plotgui.current_plot-1]['hybridlog'] == 1:
        ylim = general_utilities.inverse_hybrid_transform(
            plotgui.yparameters[plotgui.current_plot-1]['minimum'])
        plotgui.ymin_field.insert(0, ylim)
    else:
        plotgui.ymin_field.insert(
            0, plotgui.yparameters[plotgui.current_plot-1]['minimum'])
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Y Axis Maximum:')
    label.pack(side=Tk.LEFT)
    plotgui.ymax_field = Tk.Entry(field1, width=20)
    plotgui.ymax_field.pack(side=Tk.LEFT)
    if plotgui.yparameters[plotgui.current_plot-1]['hybridlog'] == 1:
        ylim = general_utilities.inverse_hybrid_transform(
            plotgui.yparameters[plotgui.current_plot-1]['maximum'])
        plotgui.ymax_field.insert(0, ylim)
    else:
        plotgui.ymax_field.insert(
            0, plotgui.yparameters[plotgui.current_plot-1]['maximum'])
    holder1 = Tk.Frame(outframe)
    holder1.pack(side=Tk.LEFT)
    # Note it is not possible to put in the line height
    # automatically as the frames it is intended to match has
    # not been packed yet.
    sl = general_utilities.separator_line(holder1, 5, 550, 5, False)
    holder2 = Tk.Frame(outframe)
    holder2.pack(side=Tk.LEFT)
    flag = plotgui.xparameters[plotgui.current_plot-1]['majorgridlines'] == 1
    plotgui.majorxgrid_variable = general_utilities.add_yes_no_field(
        holder2, "major x grid", flag)
    flag = plotgui.xparameters[plotgui.current_plot-1]['minorgridlines'] == 1
    plotgui.minorxgrid_variable = general_utilities.add_yes_no_field(
        holder2, "minor x grid", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['majorgridlines'] == 1
    plotgui.majorygrid_variable = general_utilities.add_yes_no_field(
        holder2, "major y grid", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['minorgridlines'] == 1
    plotgui.minorygrid_variable = general_utilities.add_yes_no_field(
        holder2, "minor y grid", flag)
    sl = general_utilities.separator_line(holder2, 200, 5, 5, True)
    flag = plotgui.xparameters[plotgui.current_plot-1]['logarithmic'] == 1
    plotgui.logx_variable = general_utilities.add_yes_no_field(
        holder2, "logarithmic x axis", flag)
    flag = plotgui.xparameters[plotgui.current_plot-1]['hybridlog'] == 1
    plotgui.hlogx_variable = general_utilities.add_yes_no_field(
        holder2, "hybrid log x axis", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['logarithmic'] == 1
    plotgui.logy_variable = general_utilities.add_yes_no_field(
        holder2, "logarithmic y axis", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['hybridlog'] == 1
    plotgui.hlogy_variable = general_utilities.add_yes_no_field(
        holder2, "hybrid log y axis", flag)
    sl = general_utilities.separator_line(holder2, 200, 5, 5, True)
    flag = plotgui.xparameters[plotgui.current_plot-1]['invert'] == 1
    plotgui.invertx_variable = general_utilities.add_yes_no_field(
        holder2, "invert x axis", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['invert'] == 1
    plotgui.inverty_variable = general_utilities.add_yes_no_field(
        holder2, "invert y axis", flag)
    flag = plotgui.xparameters[plotgui.current_plot-1]['hide'] == 1
    plotgui.hidex_variable = general_utilities.add_yes_no_field(
        holder2, "hide x axis", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['hide'] == 1
    plotgui.hidey_variable = general_utilities.add_yes_no_field(
        holder2, "hide y axis", flag)
    flag = plotgui.xparameters[plotgui.current_plot-1]['oppositeaxis'] == 1
    plotgui.oppositex_variable = general_utilities.add_yes_no_field(
        holder2, "opposite x axis", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['oppositeaxis'] == 1
    plotgui.oppositey_variable = general_utilities.add_yes_no_field(
        holder2, "opposite y axis", flag)
    sl = general_utilities.separator_line(holder2, 200, 5, 5, True)
    flag = plotgui.xparameters[plotgui.current_plot-1]['hidelabels'] == 1
    plotgui.hidexlabels_variable = general_utilities.add_yes_no_field(
        holder2, "hide x labels", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['hidelabels'] == 1
    plotgui.hideylabels_variable = general_utilities.add_yes_no_field(
        holder2, "hide y labels", flag)
    flag = plotgui.xparameters[plotgui.current_plot-1]['hideticks'] == 1
    plotgui.hidexticks_variable = general_utilities.add_yes_no_field(
        holder2, "hide x ticks", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['hideticks'] == 1
    plotgui.hideyticks_variable = general_utilities.add_yes_no_field(
        holder2, "hide y ticks", flag)
    flag = plotgui.xparameters[plotgui.current_plot-1]['bothticks'] == 1
    plotgui.bothxticks_variable = general_utilities.add_yes_no_field(
        holder2, "x ticks both sides", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['bothticks'] == 1
    plotgui.bothyticks_variable = general_utilities.add_yes_no_field(
        holder2, "y ticks both sides", flag)
    flag = plotgui.xparameters[plotgui.current_plot-1]['inverseticks'] == 1
    plotgui.inversexticks_variable = general_utilities.add_yes_no_field(
        holder2, "invert x ticks", flag)
    flag = plotgui.yparameters[plotgui.current_plot-1]['inverseticks'] == 1
    plotgui.inverseyticks_variable = general_utilities.add_yes_no_field(
        holder2, "invert y ticks", flag)
    #
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Tick length:')
    label.pack(side=Tk.LEFT)
    plotgui.ticklengthfield = Tk.Entry(field1, width=3)
    plotgui.ticklengthfield.pack()
    try:
        plotgui.ticklengthfield.insert(
            0, str(plotgui.xparameters[plotgui.current_plot-1]['ticklength']))
    except Exception:
        plotgui.ticklengthfield.insert(0, '6')
        plotgui.xparameters[plotgui.current_plot-1]['ticklength'] = 6
        plotgui.yparameters[plotgui.current_plot-1]['ticklength'] = 6
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='X Minor tick interval:')
    label.pack(side=Tk.LEFT)
    plotgui.xminortickfield = Tk.Entry(field1, width=10)
    plotgui.xminortickfield.pack()
    plotgui.xminortickfield.insert(
        0, str(plotgui.xparameters[plotgui.current_plot-1]['minorticks']))
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Y Minor tick interval:')
    label.pack(side=Tk.LEFT)
    plotgui.yminortickfield = Tk.Entry(field1, width=10)
    plotgui.yminortickfield.pack()
    plotgui.yminortickfield.insert(
        0, str(plotgui.yparameters[plotgui.current_plot-1]['minorticks']))
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Plot Legend:')
    label.pack(side=Tk.LEFT)
    if plotgui.legend_variable[plotgui.current_plot-1] is None:
        plotgui.legend_variable[plotgui.current_plot-1] = Tk.IntVar()
        flag = False
    else:
        flag = plotgui.legend_variable[plotgui.current_plot-1].get()
    b1 = Tk.Frame(field1)
    general_utilities.put_yes_no(
        b1, plotgui.legend_variable[plotgui.current_plot-1],
        ['Yes', 'No'], flag)
    b1.pack()
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Legend type:')
    label.pack(side=Tk.LEFT)
    if plotgui.legend_options[plotgui.current_plot-1] is None:
        plotgui.legend_options[plotgui.current_plot-1] = Tk.StringVar()
        plotgui.legend_options[plotgui.current_plot-1].set('best')
        plotgui.legend_position[plotgui.current_plot-1] = 'best'
    else:
        plotgui.legend_options[plotgui.current_plot-1].set(
            plotgui.legend_position[plotgui.current_plot-1])
    plotgui.legend_option_list = ['user', 'best', 'upper right',
                                  'upper left', 'lower left',
                                  'lower right', 'right',
                                  'center left', 'center right',
                                  'lower center', 'upper center',
                                  'center']
    menu1 = Tk.OptionMenu(field1,
                          plotgui.legend_options[plotgui.current_plot-1],
                          *plotgui.legend_option_list,
                          command=plotgui.generate_legend)
    menu1.config(width=10)
    menu1.pack(side=Tk.LEFT)
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='User legend position:')
    label.pack(side=Tk.LEFT)
    plotgui.legend_position_field = Tk.Entry(field1, width=20)
    plotgui.legend_position_field.pack(side=Tk.LEFT)
    if plotgui.legend_user_position[plotgui.current_plot-1] is None:
        plotgui.legend_position_field.insert(0, '0.1 0.1')
    else:
        str1 = '%.3f %.3f' % (
            plotgui.legend_user_position[plotgui.current_plot-1][0],
            plotgui.legend_user_position[plotgui.current_plot-1][1])
        plotgui.legend_position_field.insert(0, str1)
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Legend frame:')
    label.pack(side=Tk.LEFT)
    if plotgui.legend_frame[plotgui.current_plot-1] is None:
        plotgui.legend_frame[plotgui.current_plot-1] = Tk.IntVar()
        plotgui.legend_frame[plotgui.current_plot-1].set(0)
        flag = False
    else:
        flag = plotgui.legend_frame[plotgui.current_plot-1].get()
    b1 = Tk.Frame(field1)
    general_utilities.put_yes_no(
        b1, plotgui.legend_frame[plotgui.current_plot-1],
        ['Yes', 'No'], flag)
    b1.pack()
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Plot margin:')
    label.pack(side=Tk.LEFT)
    plotgui.plot_margin_field = Tk.Entry(field1, width=10)
    plotgui.plot_margin_field.pack(side=Tk.LEFT)
    if plotgui.plot_margin is None:
        plotgui.plot_margin_field.insert(0, '0.0')
        plotgui.plot_margin = 0.0
    else:
        plotgui.plot_margin_field.insert(0, '%f' % (plotgui.plot_margin))
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Frame Width:')
    label.pack(side=Tk.LEFT)
    plotgui.plot_frame_field = Tk.Entry(field1, width=10)
    plotgui.plot_frame_field.pack(side=Tk.LEFT)
    if (plotgui.plot_frame[plotgui.current_plot-1] is None) or \
       (plotgui.plot_frame[plotgui.current_plot-1] <= 0.):
        plotgui.plot_frame_field.insert(0, '0.0')
        plotgui.plot_frame[plotgui.current_plot-1] = 0.0
    else:
        plotgui.plot_frame_field.insert(0, '%f' % (
            plotgui.plot_frame[plotgui.current_plot-1]))
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Grid Colour:')
    label.pack(side=Tk.LEFT)
    if plotgui.grid_colour_variable is None:
        plotgui.grid_colour_variable = Tk.StringVar()
        plotgui.grid_colour_variable.set('black')
    if plotgui.grid_colour[plotgui.current_plot-1] is None:
        plotgui.grid_colour[plotgui.current_plot-1] = 'black'
    try:
        plotgui.grid_colour_variable.set(
            plotgui.grid_colour[plotgui.current_plot-1])
    except:
        pass
    menu1 = Tk.OptionMenu(
        field1, plotgui.grid_colour_variable,
        *plotgui.colourset, command=plotgui.set_grid_colour)
    menu1.pack()
    field1 = Tk.Frame(holder)
    field1.pack(side=Tk.TOP)
    label = Tk.Label(field1, text='Grid Line Type:')
    label.pack(side=Tk.LEFT)
    if plotgui.grid_linetype_variable is None:
        plotgui.grid_linetype_variable = Tk.StringVar()
        plotgui.grid_linetype_variable.set('solid')
    if plotgui.grid_linetype[plotgui.current_plot-1] is None:
        plotgui.grid_linetype[plotgui.current_plot-1] = '--'
    for loop in range(len(matplotlib_line_list)):
        if matplotlib_line_list[loop] == \
           plotgui.grid_linetype[plotgui.current_plot-1]:
            plotgui.grid_linetype_variable.set(matplotlib_line_name_list[loop])
    menu1 = Tk.OptionMenu(
        field1, plotgui.grid_linetype_variable,
        *matplotlib_line_name_list, command=plotgui.set_grid_linetype)
    menu1.pack()
    holder = Tk.Frame(plotgui.plot_control_window)
    holder.pack(side=Tk.TOP)
    # find the width for the separator line and apply it...
    outframe.update()
    sl = general_utilities.separator_line(
        holder, outframe.winfo_width(), 5, 5, True)
    field1 = Tk.Frame(plotgui.plot_control_window)
    field1.pack(side=Tk.TOP)
    apply_button = Tk.Button(field1, text="Apply",
                             command=lambda: apply_plot_parameters(plotgui))
    apply_button.pack(side=Tk.LEFT)
    label1 = Tk.Label(field1, text="    ")
    label1.pack(side=Tk.LEFT)
    apply_all_button = Tk.Button(
        field1, text="Apply to All",
        command=lambda: apply_plot_parameters_all(plotgui))
    apply_all_button.pack(side=Tk.LEFT)
    label1 = Tk.Label(field1, text="    ")
    label1.pack(side=Tk.LEFT)
    close_button = Tk.Button(
        field1, text="Close",
        command=lambda: plotgui.close_window(plotgui.plot_control_window,
                                             'plot_control_window'))
    close_button.pack(side=Tk.LEFT)
Example #2
0
def add_vector_values(plotgui):
    """
    Create a vector for the plot.

    This code is activated when the vector definition option is selected.
    When a button press event and then a button release event are received
    then the positions are recorded in plotgui.positions.  This routine reads
    these positions and presents a window with the vector parameters for
    the user to change as they wish.

    Parameters
    ----------

        plotgui:  the matplotlib_user_interface object holding the plot

    Returns
    -------

        None

    """
    matplotlib_line_name_list = [
        'solid', 'dashed', 'dashdot', 'dotted', 'None'
    ]
    BGCOL = '#F8F8FF'
    try:
        var = plotgui.positions[-2][0]
        var = plotgui.positions[-2][1]
        var = plotgui.positions[-1][0]
        var = plotgui.positions[-1][1]
    except ValueError:
        tkinter.messagebox.showinfo(
            "Error", "The required start " +
            "and stop positions are not available to make a vector.")
        return
    plotgui.vector_flag = False
    plotgui.vector_window = Tk.Toplevel()
    plotgui.vector_window.title('Set Vector Properties')
    plotgui.vector_window.config(bg=BGCOL)
    frame1 = Tk.Frame(plotgui.vector_window)
    frame1.pack(side=Tk.TOP)
    label = Tk.Label(frame1, text='Start x')
    label.grid(column=0, row=0)
    label = Tk.Label(frame1, text='Start y')
    label.grid(column=0, row=1)
    label = Tk.Label(frame1, text='End x')
    label.grid(column=0, row=2)
    label = Tk.Label(frame1, text='End y')
    label.grid(column=0, row=3)
    label = Tk.Label(frame1, text='Vector Head del x')
    label.grid(column=0, row=4)
    label = Tk.Label(frame1, text='Vector Head del y')
    label.grid(column=0, row=5)
    label = Tk.Label(frame1, text='Line type')
    label.grid(column=0, row=6)
    label = Tk.Label(frame1, text='Line colour')
    label.grid(column=0, row=7)
    label = Tk.Label(frame1, text='Line thickness')
    label.grid(column=0, row=8)
    label = Tk.Label(frame1, text='Fill head')
    label.grid(column=0, row=9)
    label = Tk.Label(frame1, text='Head colour')
    label.grid(column=0, row=10)
    # vectorfields holds the vector parameter entry/menu items
    # 0 to 3    positions
    # 4 and 5 vector head x and y sizes
    # 6 line type (solid, dashed, etc)
    # 7 line colour
    # 8 line thickness
    # 9 head fill (radio button)
    # 10 head fill colour
    plotgui.vectorfields = []
    plotgui.vectorfields.append(Tk.Entry(frame1, width=20))
    plotgui.vectorfields[-1].grid(column=1, row=0, sticky=Tk.W)
    plotgui.vectorfields.append(Tk.Entry(frame1, width=20))
    plotgui.vectorfields[-1].grid(column=1, row=1, sticky=Tk.W)
    plotgui.vectorfields.append(Tk.Entry(frame1, width=20))
    plotgui.vectorfields[-1].grid(column=1, row=2, sticky=Tk.W)
    plotgui.vectorfields.append(Tk.Entry(frame1, width=20))
    plotgui.vectorfields[-1].grid(column=1, row=3, sticky=Tk.W)
    plotgui.vectorfields.append(Tk.Entry(frame1, width=20))
    plotgui.vectorfields[-1].grid(column=1, row=4, sticky=Tk.W)
    plotgui.vectorfields.append(Tk.Entry(frame1, width=20))
    plotgui.vectorfields[-1].grid(column=1, row=5, sticky=Tk.W)
    plotgui.vectorfields[0].insert(0, str(plotgui.positions[-2][0]))
    plotgui.vectorfields[1].insert(0, str(plotgui.positions[-2][1]))
    plotgui.vectorfields[2].insert(0, str(plotgui.positions[-1][0]))
    plotgui.vectorfields[3].insert(0, str(plotgui.positions[-1][1]))
    plotgui.vectorfields[4].insert(0, str(0.1))
    plotgui.vectorfields[5].insert(0, str(0.1))
    plotgui.vectorfields.append(tkinter.ttk.Combobox(frame1, width=15))
    plotgui.vectorfields[-1].grid(column=1, row=6, sticky=Tk.W)
    plotgui.vectorfields[-1]['values'] = matplotlib_line_name_list[0:-1]
    plotgui.vectorfields[-1].current(0)
    plotgui.vectorfields.append(tkinter.ttk.Combobox(frame1, width=15))
    plotgui.vectorfields[-1].grid(column=1, row=7, sticky=Tk.W)
    plotgui.vectorfields[-1]['values'] = plotgui.colourset
    plotgui.vectorfields[-1].current(0)
    plotgui.vectorfields.append(Tk.Entry(frame1, width=15))
    plotgui.vectorfields[-1].grid(column=1, row=8, sticky=Tk.W)
    plotgui.vectorfields[-1].insert(0, '1.0')
    plotgui.vector_head_fill_flag = Tk.IntVar()
    plotgui.vectorfields.append(plotgui.vector_head_fill_flag)
    plotgui.vectorfields.append(tkinter.ttk.Combobox(frame1, width=15))
    b1 = Tk.Frame(frame1, )
    b1.grid(column=1, row=9, sticky=Tk.W)
    general_utilities.put_yes_no(b1, plotgui.vector_head_fill_flag,
                                 ['yes', 'no'], True)
    plotgui.vectorfields[-1].grid(column=1, row=10, sticky=Tk.W)
    plotgui.vectorfields[-1]['values'] = plotgui.colourset
    plotgui.vectorfields[-1].current(0)
    frame2 = Tk.Frame(plotgui.vector_window)
    frame2.pack(side=Tk.TOP)
    apply_button = Tk.Button(frame2,
                             text="Apply",
                             command=lambda: apply_vector_values(plotgui))
    apply_button.pack(side=Tk.LEFT)
    label1 = Tk.Label(frame2, text="    ")
    label1.pack(side=Tk.LEFT)
    close_button = Tk.Button(frame2,
                             text="Close",
                             command=lambda: plotgui.close_window(
                                 plotgui.vector_window, 'vector_window'))
    close_button.pack(side=Tk.LEFT)
def make_controls(plotgui, parent):
    """
    Make the control area within the main window.

    This routine makes a control area within the main window, under
    frame "parent".  The overall root value is also passed here, but
    not currently used.  It may be neeed for orderly closing of the
    window depending on what is done in the main window, hence it is
    included here.

    Parameters
    ----------

        plotgui:   by assumption a matplotlib_user_interface object

        parent :   A Tk.Frame variable for the holder of the controla

    Returns
    -------

        None

    """
    holder = Tk.Frame(parent)
    holder.pack(side=Tk.TOP)
    label1 = Tk.Label(holder, text=' ')
    label1.pack(side=Tk.TOP, fill=Tk.X)
    button1 = Tk.Button(holder,
                        text='Plot',
                        command=lambda: make_plot.make_plot(plotgui))
    button1.pack(side=Tk.TOP, fill=Tk.X)
    button2 = Tk.Button(holder,
                        text='Auto scale',
                        command=plotgui.autoscale_plot)
    button2.pack(side=Tk.TOP, fill=Tk.X)
    sl = general_utilities.separator_line(holder, 300, 25, 5, True)
    button3 = Tk.Button(
        holder,
        text='2-D Histogram',
        command=lambda: histogram_utilities.make_hess_plot(plotgui))
    button3.pack(side=Tk.TOP, fill=Tk.X)
    field = Tk.Frame(holder)
    field.pack(side=Tk.TOP)
    label1 = Tk.Label(field, text='Number of pixels: ')
    label1.pack(side=Tk.LEFT)
    plotgui.npixelfield = Tk.Entry(field, width=5)
    plotgui.npixelfield.pack(side=Tk.TOP)
    plotgui.npixelfield.insert(0, '500')
    plotgui.overplotflag = Tk.IntVar()
    h1 = Tk.Frame(holder)
    h1.pack(side=Tk.TOP)
    plotgui.hessindividualhistogramflag = Tk.IntVar()
    b1 = Tk.Frame(h1)
    general_utilities.put_yes_no(b1, plotgui.hessindividualhistogramflag,
                                 ['all sets', 'one set'], True)
    b1.pack(side=Tk.LEFT)
    b1 = Tk.Frame(h1)
    plotgui.hess_set_field = Tk.Entry(b1, width=5)
    plotgui.hess_set_field.insert(0, '1')
    plotgui.hess_set_field.pack(side=Tk.LEFT)
    b1.pack(side=Tk.LEFT)
    h1 = Tk.Frame(holder)
    h1.pack(side=Tk.TOP)
    label1 = Tk.Label(h1, text='Overplot Sets: ')
    label1.pack(side=Tk.LEFT)
    b1 = Tk.Frame(h1)
    general_utilities.put_yes_no(
        b1,
        plotgui.overplotflag,
        ['Yes', 'No'],
        True,
    )
    b1.pack(side=Tk.LEFT)
    sl = general_utilities.separator_line(holder, 300, 25, 5, True)
    button4 = Tk.Button(
        holder,
        text='1-D Histogram',
        command=lambda: histogram_utilities.make_histogram(plotgui))
    button4.pack(side=Tk.TOP, fill=Tk.X)
    field = Tk.Frame(holder)
    field.pack(side=Tk.TOP)
    label1 = Tk.Label(field, text='Number of bins or bin size: ')
    label1.pack(side=Tk.LEFT)
    plotgui.nbinfield = Tk.Entry(field, width=10)
    plotgui.nbinfield.pack(side=Tk.TOP)
    plotgui.nbinfield.insert(0, '500')
    plotgui.histogramflag = Tk.IntVar()
    b1 = Tk.Frame(holder)
    general_utilities.put_yes_no(b1, plotgui.histogramflag,
                                 ['x values', 'y values'], True)
    b1.pack(side=Tk.TOP)
    plotgui.histogramflag = Tk.IntVar()
    b1 = Tk.Frame(holder)
    plotgui.individualhistogramflag = Tk.IntVar()
    general_utilities.put_yes_no(b1, plotgui.individualhistogramflag,
                                 ['all sets', 'individual sets'], True)
    b1.pack(side=Tk.TOP)
    sl = general_utilities.separator_line(holder, 300, 25, 5, True)
    plotgui.matplotlib_rounding = Tk.IntVar()
    b1 = Tk.Frame(holder)
    label1 = Tk.Label(b1, text='Axis limits rounding algorithm: ')
    label1.pack(side=Tk.TOP)
    b1.pack(side=Tk.TOP)
    b1 = Tk.Frame(holder)
    general_utilities.put_yes_no(b1, plotgui.matplotlib_rounding,
                                 ['Matplotlib', 'Alternate'], True)
    b1.pack(side=Tk.TOP)
    sl = general_utilities.separator_line(holder, 300, 25, 5, True)
    button5 = Tk.Button(
        holder,
        text='Save as PNG',
        command=lambda: general_utilities.save_png_figure(plotgui.figure))
    button5.pack(side=Tk.TOP, fill=Tk.X)
    button6 = Tk.Button(
        holder,
        text='Save as PS',
        command=lambda: general_utilities.save_ps_figure(plotgui.figure))
    button6.pack(side=Tk.TOP, fill=Tk.X)
    button7 = Tk.Button(
        holder,
        text='Clear Current Plot',
        command=lambda: plot_flag_utilities.clear_current_plot(plotgui))
    button7.pack(side=Tk.TOP, fill=Tk.X)
    button8 = Tk.Button(
        holder,
        text='Tile Plots',
        command=lambda: plot_flag_utilities.tile_plots(plotgui))
    button8.pack(side=Tk.TOP, fill=Tk.X)
    button9 = Tk.Button(
        holder,
        text='Set Plot',
        command=lambda: plot_flag_utilities.set_plot_number(plotgui))
    button9.pack(side=Tk.TOP, fill=Tk.X)
    button10 = Tk.Button(holder,
                         text='Close Window',
                         command=plotgui.root.destroy)
    button10.pack(side=Tk.TOP, fill=Tk.X)
def make_data_set_transformation_window(plotgui):
    """
    Create the data set transformation window.

    This routine makes a window within which a data set transformation
    can be defined.  The user can either transform an existing set or
    use the transformation to make a new set.

    Parameters
    ----------

        plotgui:   by assumption a matplotlib_user_interface object

    Returns
    -------

       None

    """
    if plotgui.data_set_transformation_window is not None:
        return
    plotgui.data_set_transformation_window = Tk.Toplevel()
    plotgui.data_set_transformation_window.title(
        'Data Set Transformation Window')
    holder = Tk.Frame(plotgui.data_set_transformation_window)
    holder.pack(side=Tk.TOP)
    plotgui.set_list_area1 = tkinter.ttk.Combobox(holder, width=50, height=10)
    plotgui.set_list_area1.pack(side=Tk.TOP)
    if plotgui.nsets == 0:
        setlist = [' ']
    else:
        setlist = []
        for loop in range(plotgui.nsets):
            label = ('Set %3d: %5d points, x range %13.6g to %13.6g, ' %
                     (loop + 1, len(plotgui.xdata[loop]['values']), plotgui.
                      xdata[loop]['minimum'], plotgui.xdata[loop]['maximum']) +
                     ' y range %13.6g to %13.6g' %
                     (plotgui.ydata[loop]['minimum'],
                      plotgui.ydata[loop]['maximum']))
            setlist.append(label)
    plotgui.set_list_area1['values'] = setlist
    plotgui.set_list_area1.current(0)
    #    plotgui.set_list_area1.bind('<<ComboboxSelected>>', plotgui.set_fields1)
    frame1 = Tk.Frame(holder)
    frame1.pack()
    label1 = Tk.Label(frame1, text='Set Transformation:')
    label1.grid(row=0, column=0, columnspan=2)
    label2 = Tk.Label(frame1, text='x transformation')
    label2.grid(row=1, column=0)
    plotgui.set_x_transformation_entry_field = Tk.Entry(frame1, width=30)
    plotgui.set_x_transformation_entry_field.grid(row=1, column=1)
    label2 = Tk.Label(frame1, text='y transformation')
    label2.grid(row=2, column=0)
    plotgui.set_y_transformation_entry_field = Tk.Entry(frame1, width=30)
    plotgui.set_y_transformation_entry_field.grid(row=2, column=1)
    frame1 = Tk.Frame(holder)
    frame1.pack()
    label1 = Tk.Label(frame1, text='Create new set?')
    label1.grid(row=0, column=0)
    plotgui.new_set = Tk.IntVar()
    b1 = Tk.Frame(frame1)
    general_utilities.put_yes_no(b1, plotgui.new_set, ['Yes', 'No'], False)
    b1.grid(column=1, row=0, sticky=Tk.W)
    label_str = 'Enter the function you wish to apply.  Use $x for the x values of the \ncurrent set and $y for the y values of the current set selected above.  \nOne can also use $i for an index starting at 1.'
    label1 = Tk.Label(holder, text=label_str)
    label1.pack(side=Tk.TOP)
    frame2 = Tk.Frame(holder)
    frame2.pack()
    apply_button = Tk.Button(frame2,
                             text="Apply",
                             command=lambda: apply_transformation(plotgui))
    apply_button.pack(side=Tk.LEFT)
    close_button = Tk.Button(frame2,
                             text="Close",
                             command=lambda: plotgui.close_window(
                                 plotgui.data_set_transformation_window,
                                 'data_set_transformation_window'))
    close_button.pack(side=Tk.LEFT)
def make_data_set_sort_window(plotgui):
    """
    Create the data set sorting window.

    This routine brings up a window within which one can sort a data set.
    The sorted data values replace the current data in the set.

    Parameters
    ----------

        plotgui:   by assumption a matplotlib_user_interface object

    Returns
    -------

       None

    """
    if plotgui.data_set_sort_window is not None:
        return
    if plotgui.nsets == 0:
        return
    plotgui.data_set_sort_window = Tk.Toplevel()
    plotgui.data_set_sort_window.title('Data Sets Sort Window')
    holder = Tk.Frame(plotgui.data_set_sort_window)
    holder.pack(side=Tk.TOP)
    plotgui.set_sort_list_area = tkinter.ttk.Combobox(holder,
                                                      width=50,
                                                      height=10)
    plotgui.set_sort_list_area.pack(side=Tk.TOP)
    setlist = []
    for loop in range(plotgui.nsets):
        label = (
            'Set %3d: %5d points, x range %13.6g to %13.6g, ' %
            (loop + 1, len(plotgui.xdata[loop]['values']),
             plotgui.xdata[loop]['minimum'], plotgui.xdata[loop]['maximum']))
        label = (
            label + 'y range %13.6g to %13.6g' %
            (plotgui.ydata[loop]['minimum'], plotgui.ydata[loop]['maximum']))
        setlist.append(label)
    plotgui.set_sort_list_area['values'] = setlist
    plotgui.set_sort_list_area.current(0)
    frame1 = Tk.Frame(holder)
    frame1.pack()
    plotgui.sortflag1 = Tk.IntVar()
    plotgui.sortflag2 = Tk.IntVar()
    lb = Tk.Label(frame1, text="Sort on: ")
    lb.pack(side=Tk.LEFT)
    b1 = Tk.Frame(frame1)
    b1.pack()
    general_utilities.put_yes_no(b1, plotgui.sortflag1,
                                 ['x values', 'y values'], True)
    lb = Tk.Label(frame1, text="Sort order: ")
    lb.pack(side=Tk.LEFT)
    b1 = Tk.Frame(frame1)
    b1.pack()
    general_utilities.put_yes_no(b1, plotgui.sortflag2,
                                 ['Ascending', 'Decending'], True)
    frame2 = Tk.Frame(holder)
    frame2.pack(side=Tk.TOP)
    sort_button = Tk.Button(frame2,
                            text="Sort",
                            command=lambda: sort_set(plotgui))
    sort_button.pack(side=Tk.LEFT)
    close_button = Tk.Button(
        frame2,
        text="Close",
        command=lambda: plotgui.close_window(plotgui.data_set_sort_window,
                                             'data_set_sort_window'))
    close_button.pack(side=Tk.LEFT)
def make_data_set_window(plotgui):
    """
    Create the data set properties window (symbol, colour, etc).

    The code makes a window within which one can set the display parameters
    for the data sets (symbol, colour, line properties, legend labels).  When
    one exits the window it is destroyed, so it gets regenerated each time
    the parent button is clicked.

    Parameters
    ----------

        plotgui:   by assumption a matplotlib_user_interface object

    Returns
    -------

       None

    """
    matplotlib_line_list = ['-', '--', '-.', ':', None]
    matplotlib_line_name_list = [
        'solid', 'dashed', 'dashdot', 'dotted', 'None'
    ]
    matplotlib_symbol_list = [
        None, ".", ", ", "o", "v", "^", "<", ">", "1", "2", "3", "4", "8", "s",
        "p", "P", "*", "h", "H", "+", "x", "X", "D", "d", "|", "_", "histogram"
    ]
    matplotlib_symbol_name_list = [
        'None', 'point', 'pixel', 'circle', 'triangle down', 'triangle up',
        'triangle left', 'triangle right', 'tri_down', 'tri_up', 'tri_left',
        'tri_right', 'octagon', 'square', 'pentagon', 'plus (filled)', 'star',
        'hexagon1', 'hexagon2', 'plus', 'x', 'x (filled)', 'diamond',
        'thin_diamond', 'vline', 'hline', 'histogram'
    ]
    if plotgui.data_set_window is not None:
        return
    plotgui.data_set_window = Tk.Toplevel()
    plotgui.data_set_window.title('Data Sets Window')
    holder = Tk.Frame(plotgui.data_set_window)
    holder.pack(side=Tk.TOP)
    plotgui.set_list_area = tkinter.ttk.Combobox(holder, width=50, height=10)
    plotgui.set_list_area.pack(side=Tk.TOP)
    if plotgui.nsets == 0:
        setlist = [' ']
    else:
        setlist = []
        for loop in range(plotgui.nsets):
            label = ('Set %3d: %5d points, x range %13.6g to %13.6g, ' %
                     (loop + 1, len(plotgui.xdata[loop]['values']), plotgui.
                      xdata[loop]['minimum'], plotgui.xdata[loop]['maximum']) +
                     ' y range %13.6g to %13.6g' %
                     (plotgui.ydata[loop]['minimum'],
                      plotgui.ydata[loop]['maximum']))
            setlist.append(label)
    plotgui.set_list_area['values'] = setlist
    plotgui.set_list_area.current(0)
    plotgui.set_list_area.bind('<<ComboboxSelected>>', plotgui.set_fields)
    frame1 = Tk.Frame(holder)
    frame1.pack()
    plotgui.set_window_label = Tk.Label(frame1, text='Set Properties:')
    plotgui.set_window_label.grid(row=0, column=0, columnspan=2)
    labels = [
        'Symbol', 'Symbol Size', 'Line', 'Line Width', 'Colour', 'Show',
        'Error Bars', 'Label', 'Legend', 'Plot'
    ]
    for loop in range(len(labels)):
        label = Tk.Label(frame1, text=labels[loop])
        label.grid(column=0, row=loop + 1, sticky=Tk.W)
    plotgui.set_entry_fields = []
    # item 0: menu for the symbol
    plotgui.set_entry_fields.append(tkinter.ttk.Combobox(frame1, width=15))
    plotgui.set_entry_fields[-1].grid(column=1, row=1, sticky=Tk.W)
    plotgui.set_entry_fields[-1]['values'] = matplotlib_symbol_name_list
    plotgui.set_entry_fields[-1].current(0)
    # item 1: entry field for the symbol size value
    plotgui.set_entry_fields.append(Tk.Entry(frame1, width=15))
    plotgui.set_entry_fields[-1].grid(column=1, row=2, sticky=Tk.W)
    plotgui.set_entry_fields[-1].insert(0, '1.0')
    # item 2: menu for the line style
    plotgui.set_entry_fields.append(tkinter.ttk.Combobox(frame1, width=15))
    plotgui.set_entry_fields[-1].grid(column=1, row=3, sticky=Tk.W)
    plotgui.set_entry_fields[-1]['values'] = matplotlib_line_name_list
    plotgui.set_entry_fields[-1].current(1)
    # item 3: entry field for the line width value
    plotgui.set_entry_fields.append(Tk.Entry(frame1, width=15))
    plotgui.set_entry_fields[-1].grid(column=1, row=4, sticky=Tk.W)
    # item 4: menu for the colour value
    plotgui.set_entry_fields.append(tkinter.ttk.Combobox(frame1, width=15))
    plotgui.set_entry_fields[-1].grid(column=1, row=5, sticky=Tk.W)
    plotgui.set_entry_fields[-1]['values'] = plotgui.colourset
    plotgui.set_entry_fields[-1].current(0)
    # item 5: variable for the show/hide set option
    plotgui.set_entry_fields.append(Tk.IntVar())
    b1 = Tk.Frame(frame1)
    general_utilities.put_yes_no(b1, plotgui.set_entry_fields[-1],
                                 ['Yes', 'No'], True)
    b1.grid(column=1, row=6, sticky=Tk.W)
    # item 6: variable for the error bar display option
    plotgui.set_entry_fields.append(Tk.IntVar())
    b1 = Tk.Frame(frame1)
    general_utilities.put_yes_no(b1, plotgui.set_entry_fields[-1],
                                 ['Yes', 'No'], False)
    b1.grid(column=1, row=7, sticky=Tk.W)
    # item 7: entry field for the set label (for the legend, if any)
    plotgui.set_entry_fields.append(Tk.Entry(frame1, width=35))
    plotgui.set_entry_fields[-1].grid(column=1, row=8, sticky=Tk.W)
    # item 8: flag for whether to include the set in the legend
    plotgui.set_entry_fields.append(Tk.IntVar())
    b1 = Tk.Frame(frame1)
    general_utilities.put_yes_no(b1, plotgui.set_entry_fields[-1],
                                 ['Yes', 'No'], True)
    b1.grid(column=1, row=9, sticky=Tk.W)
    # item 9: Entry field for which plot the set belongs to
    plotgui.set_entry_fields.append(Tk.Entry(frame1, width=5))
    plotgui.set_entry_fields[-1].grid(column=1, row=10, sticky=Tk.W)
    plotgui.set_entry_fields[-1].insert(0, str(plotgui.current_plot))
    frame2 = Tk.Frame(holder)
    frame2.pack()
    apply_button = Tk.Button(frame2,
                             text="Apply",
                             command=lambda: apply_data_set_fields(plotgui))
    apply_button.pack(side=Tk.LEFT)
    label1 = Tk.Label(frame2, text="    ")
    label1.pack(side=Tk.LEFT)
    apply_all_button = Tk.Button(
        frame2,
        text="Apply to All",
        command=lambda: apply_data_set_fields_all(plotgui))
    apply_all_button.pack(side=Tk.LEFT)
    label1 = Tk.Label(frame2, text="    ")
    label1.pack(side=Tk.LEFT)
    close_button = Tk.Button(frame2,
                             text="Close",
                             command=lambda: plotgui.close_window(
                                 plotgui.data_set_window, 'data_set_window'))
    close_button.pack(side=Tk.LEFT)
    if plotgui.nsets > 0:
        plotgui.set_property_fields(0)