顶部带有线的多轴图。 Matplotlib

Posted

技术标签:

【中文标题】顶部带有线的多轴图。 Matplotlib【英文标题】:Multi-Axis Graph with Line on top. Matplotlib 【发布时间】:2015-07-21 05:39:12 【问题描述】:

我正在尝试使用 twinx() 创建一个条形/线条组合图,线条在条形顶部可见。目前是这样的:

我还需要在左侧垂直轴 (ax) 和右侧 (ax2) 上绘制当前的折线图。如果我在第二个轴上绘制线,它确实出现在顶部,但显然它出现在错误的轴上(右)

这是我的代码:

    self.ax2=ax.twinx()
    df[['Opportunities']].plot(kind='bar', stacked=False, title=get_title, color='grey', ax=self.ax2, grid=False)
    ax.plot(ax.get_xticks(),df[['Percentage']].values, linestyle='-', marker='o', color='k', linewidth=1.0)
    lines, labels = ax.get_legend_handles_labels()
    lines2, labels2 = self.ax2.get_legend_handles_labels()
    ax.legend(lines + lines2, labels + labels2, loc='lower right')

标签也有问题,但一次只做一件事。

【问题讨论】:

【参考方案1】:

默认情况下,艺术家首先在ax 上绘制,然后是 双轴上的艺术家ax2 在顶部。因此,由于在您的代码中,线图是在 ax 上绘制的,而条形图是在 ax2 上绘制的,因此条形图位于(并遮住)线的顶部。

(我以为我可以通过指定 zorder 来改变这一点,但那次尝试并没有 工作......)

所以解决问题的一种方法是使用ax 绘制条形图,使用ax2 绘制线条。这会将线放在条形图的顶部。默认情况下,它还会将ax(条形图)的ytick 标签放在左侧,将ax2(线条)的ytick 标签放在右侧。但是,您可以使用

ax.yaxis.set_ticks_position("right")
ax2.yaxis.set_ticks_position("left")

交换左右 ytick 标签的位置。


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
np.random.seed(2015)

N = 16
df = pd.DataFrame('Opportunities': np.random.randint(0, 30, size=N),
                   'Percentage': np.random.randint(0, 100, size=N),
                  index=pd.date_range('2015-3-15', periods=N, freq='B').date)
fig, ax = plt.subplots()

df[['Opportunities']].plot(kind='bar', stacked=False, title='get_title', 
                           color='grey', ax=ax, grid=False)
ax2 = ax.twinx()
ax2.plot(ax.get_xticks(), df[['Percentage']].values, linestyle='-', marker='o', 
        color='k', linewidth=1.0, label='percentage')

lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax.legend(lines + lines2, labels + labels2, loc='best')
ax.yaxis.set_ticks_position("right")
ax2.yaxis.set_ticks_position("left")

fig.autofmt_xdate()
plt.show()

产量


或者,可以设置轴的zorder,以便在ax2 上方绘制ax。 Paul Ivanov shows how:

ax.set_zorder(ax2.get_zorder()+1) # put ax in front of ax2
ax.patch.set_visible(False) # hide the 'canvas'
ax2.patch.set_visible(True) # show the 'canvas'

因此,

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
np.random.seed(2015)

N = 16
df = pd.DataFrame('Opportunities': np.random.randint(0, 30, size=N),
               'Percentage': np.random.randint(0, 100, size=N),
index=pd.date_range('2015-3-15', periods=N, freq='B').date)
fig, ax = plt.subplots()
ax2 = ax.twinx()
df[['Opportunities']].plot(kind='bar', stacked=False, title='get_title', 
                           color='grey', ax=ax2, grid=False)

ax.plot(ax.get_xticks(), df[['Percentage']].values, linestyle='-', marker='o', 
        color='k', linewidth=1.0, label='percentage')

lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax.legend(lines + lines2, labels + labels2, loc='best')

ax.set_zorder(ax2.get_zorder()+1) # put ax in front of ax2
ax.patch.set_visible(False) # hide the 'canvas'
ax2.patch.set_visible(True) # show the 'canvas'

fig.autofmt_xdate()
plt.show()

无需交换axax2 所扮演的角色即可产生相同的结果。

【讨论】:

这很棒。非常感谢!

以上是关于顶部带有线的多轴图。 Matplotlib的主要内容,如果未能解决你的问题,请参考以下文章

HighCharts之2D柱状图 折线图的组合多轴图

NVD3 多轴条形图在绘图上重叠条形图

带有 WinForms .NET 时间线的交互式图表 [关闭]

我们可以在 OBIEE 中创建带有时间线的动态信息图表吗?

动态数据显示多轴缩放

R中带有误差线的分组条形图