Matplotlib:隐藏在主轴背景

时间:2018-02-21 17:16:34

标签: python matplotlib tkinter z-order

我正在努力展示双轴图和主轴图。这就是我在做的事情:

  1. 我创建了主轴和双轴。
  2. 我将主轴的zorder设置为比双轴更高的值,因为我希望事件处理程序为主轴选择事件(即跟踪工具栏中的Y轴)
  3. 然后,我绘制两个数字,位于双轴的补丁隐藏在主轴的背景后面。 (我知道这是因为如果我取消注释a.patch.set_visible(False)行,我能够看到双轴轴线图)
  4. 但是,我想保持跟踪主轨道的Y轴以及背景的能力,因为它们具有不同的比例。 这里有一个最小的例子:

    import matplotlib
    matplotlib.use('TkAgg')
    import numpy as np
    from numpy import arange, sin, pi
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
    from matplotlib.figure import Figure
    
    import sys
    if sys.version_info[0] < 3:
        import Tkinter as Tk
    else:
        import tkinter as Tk
    
    
    root = Tk.Tk()
    root.wm_title("Embedding in TK")
    
    
    f = Figure(figsize=(5, 4), dpi=100)
    a = f.add_subplot(111)
    a.grid(True)
    a.set_facecolor('grey')
    aTwin = a.twinx()
    aTwin.grid(False)
    
    
    
    # PROBLEM HERE # Whenever I uncomment this, "aTwin" axis remains hidden.
    # Set "a" axis zorder to higher value so that event handler tracks y axis from "a" and not from "aTwin"
    a.set_zorder(aTwin.get_zorder() + 1)
    
    #a.patch.set_visible(False) # Uncomment to show volume, but I lose the background from the main axis. I cannot use twinx axis' background/grid since they are different scales
    
    x = np.arange(0.0, 2, 0.01)
    y1 = abs(np.sin(2*np.pi*x))
    y2 = 10.2*np.sin(4*np.pi*x)
    
    aTwin.set_ylim(0, 3*max(y1))
    
    a.plot(x, y2)
    aTwin.fill_between(x, 0, y1, alpha = 0.4)
    a.set_ylabel('between y1 and 0')
    
    
    # a tk.DrawingArea
    canvas = FigureCanvasTkAgg(f, master=root)
    canvas.show()
    canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
    
    toolbar = NavigationToolbar2TkAgg(canvas, root)
    toolbar.update()
    
    canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
    
    def _quit():
        root.quit()
        root.destroy()
    
    button = Tk.Button(master=root, text='Quit', command=_quit)
    button.pack(side=Tk.BOTTOM)
    
    Tk.mainloop()
    

    提前感谢您阅读此问题的时间。 :)

1 个答案:

答案 0 :(得分:3)

似乎你想要打开第一个轴的网格,设置它的补丁不可见,设置双轴&#39;补丁可见,并将此颜色为灰色。然后移动前面的原始轴是没有问题的。

import numpy as np
import matplotlib.pyplot as plt

f = plt.figure(figsize=(5, 4), dpi=100)
ax = f.add_subplot(111)
axTwin = ax.twinx()

# Turn grid of a on.
ax.grid(True)
axTwin.grid(False)

# Set ax's patch invisible
ax.patch.set_visible(False)
# Set axtwin's patch visible and colorize it in grey
axTwin.patch.set_visible(True)
axTwin.patch.set_facecolor('grey')

# move ax in front
ax.set_zorder(axTwin.get_zorder() + 1)

x = np.arange(0.0, 2, 0.01)
y1 = abs(np.sin(2*np.pi*x))
y2 = 10.2*np.sin(4*np.pi*x)

axTwin.set_ylim(0, 3*max(y1))

ax.plot(x, y2)
axTwin.fill_between(x, 0, y1, alpha = 0.4)
ax.set_ylabel('between y1 and 0')

plt.show()

enter image description here