Matplotlib:隐藏在主轴背景后面的双胞胎图
Matplotlib: twinx plot hidden behind main axis background
我正在努力显示双轴图和主轴图。这是我正在做的事情:
- 我创建了主轴和 twinx 轴。
- 我将主轴的 zorder 设置为比双轴更高的值,因为我希望事件处理程序为主轴选择事件(即跟踪工具栏中的 Y 轴)
- 然后,我绘制了两个图形,位于双轴的补丁隐藏在主轴背景后面。 (我知道这一点,因为如果我取消注释
a.patch.set_visible(False)
行,我就能看到 twinx 轴图)
但是,我想同时保留跟踪主轨道 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()
提前感谢您花时间阅读这个问题。 :)
您似乎想要打开第一个轴的网格,将其面片设置为不可见,将双轴的面片设置为可见并将其着色为灰色。然后移动前面的原坐标轴就没问题了。
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()
我正在努力显示双轴图和主轴图。这是我正在做的事情:
- 我创建了主轴和 twinx 轴。
- 我将主轴的 zorder 设置为比双轴更高的值,因为我希望事件处理程序为主轴选择事件(即跟踪工具栏中的 Y 轴)
- 然后,我绘制了两个图形,位于双轴的补丁隐藏在主轴背景后面。 (我知道这一点,因为如果我取消注释
a.patch.set_visible(False)
行,我就能看到 twinx 轴图)
但是,我想同时保留跟踪主轨道 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()
提前感谢您花时间阅读这个问题。 :)
您似乎想要打开第一个轴的网格,将其面片设置为不可见,将双轴的面片设置为可见并将其着色为灰色。然后移动前面的原坐标轴就没问题了。
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()