这是一个简单的代码,可以再现我试图绘制的图形类型:
import matplotlib.pyplot as plt
import seaborn as sb
import numpy as np
x = np.arange(1,11)
y1 = x[::-1]
y2 = 2 ** x
fig = plt.figure(figsize = (8,6))
ax1 = fig.add_subplot(111)
plt.bar(x, y1, 1, color = 'blue')
ax1.grid(axis = 'y')
ax2 = ax1.twinx()
ax2.plot(x+0.5, y2, color = 'red')
产生:
最后一行图中的网格线显示在条形图上方。我怎么能把它们放在酒吧后面?
答案 0 :(得分:0)
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1,11)
y1 = x[::-1]
y2 = 2 ** x
fig = plt.figure(figsize = (8,6))
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()
# from back to front
ax1.grid(axis="both", color="black")
ax1.bar(x, y1, 1, alpha=.9, edgecolor="black", facecolor='blue', zorder=1)
ax2.grid(axis="y", color="green")
#ax2.grid(False)
ax2.plot(x+0.5, y2, color='red')
plt.show()
产生下图,说明元素的zorder。
ax1.grid => ax1.bar => ax2.grid => ax2.line
我能想到的唯一解决方法是在ax1中绘制网格并关闭ax2网格(如果你真的想绘制ax2的水平网格线,那么你可能需要用ax1绘制线。
ax1.grid(True, axis="both", color="yellow")
ax1.bar(x, y1, 1, alpha=.9, edgecolor="black", facecolor='blue', zorder=1)
ax2.grid(False)
ax2.plot(x+0.5, y2, color='red')
答案 1 :(得分:0)
经过一些搜索和尝试后,我分享了我找到的解决方案,以便其他人可以在将来使用它作为参考。这不是我想要的,因为我希望水平网格线仅用于右轴,但是,它提供了比原始图更好的可视化。
从this开始,我发现了如何对齐左右轴蜱(这个问题也出现在线图上,但效果并不像条形图那样令人不安)。
import matplotlib.pyplot as plt
import seaborn as sb
import numpy as np
x = np.arange(1,11)
y1 = x[::-1]
y2 = 2 ** x
fig = plt.figure(figsize = (8,6))
ax1 = fig.add_subplot(111)
plt.bar(x, y1, 1, color = 'blue')
ax2 = ax1.twinx()
ax2.plot(x+0.5, y2, color = 'red')
ax2.set_yticks(np.linspace(ax2.get_yticks()[0],ax2.get_yticks()[-1],len(ax1.get_yticks())))
网格线仍位于条形图上方。但是,由于刻度线已对齐,我们现在可以通过在前一个代码的末尾添加显式命令ax2.grid(False)
来删除第二个线图的网格。
重要提示:请注意,在此示例中,左右轴上的标签都非常好。但是,在实际情况下,这种方法可能会导致右轴上出现丑陋的标签(浮动或粗糙整数)。使用这种方法,我们仍然无法设置正确的刻度线的位置,因此它不是问题的准确答案。