Python 如何跨子批次添加层次轴以标记组?

Python 如何跨子批次添加层次轴以标记组?,python,pandas,matplotlib,Python,Pandas,Matplotlib,我有一套不同的时间序列,可以分组。例如,下图显示了A、B、C和D系列。然而,A和B属于G1组,C和D属于G2组 我想通过在左侧添加另一个轴来反映这一点,该轴穿过多组涡轮机,并相应地标记这些轴 到目前为止,我已经尝试了一些方法,但显然这并不容易 有人知道我怎么做吗 PS:因为我在已经有列的数据框上使用panda的绘图(subplots=True) | G1 | G2 | |-------|------| index | A B | C D | ------|

我有一套不同的时间序列,可以分组。例如,下图显示了A、B、C和D系列。然而,A和B属于G1组,C和D属于G2组

我想通过在左侧添加另一个轴来反映这一点,该轴穿过多组涡轮机,并相应地标记这些轴

到目前为止,我已经尝试了一些方法,但显然这并不容易

有人知道我怎么做吗

PS:因为我在已经有列的数据框上使用panda的
绘图(subplots=True)

      |  G1   |  G2  |
      |-------|------|
index | A  B  | C  D |
------|-------|------|
也许熊猫已经可以为我做到了。这就是我使用标签的原因


这是我举的一个例子。因为你没有提供你的代码,我在没有熊猫的情况下做了,因为我不精通它

基本上,您可以按原样打印,然后围绕之前的所有轴创建另一个轴,使用ax5.axis('off')删除其轴,然后在其上打印2行和文本

from matplotlib import lines
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 4*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.cos(x)/(x+1)


fig = plt.figure()
fig.subplots_adjust(hspace=.5)
ax1 = plt.subplot(411)
ax1.plot(x, y1)
ax2 = plt.subplot(412)
ax2.plot(x, y2)
ax3 = plt.subplot(413)
ax3.plot(x, y3)
ax4 = plt.subplot(414)
ax4.plot(x, y4)

# new axis around the others with 0-1 limits
ax5 = plt.axes([0, 0, 1, 1])
ax5.axis('off')

line_x1, line_y1 = np.array([[0.05, 0.05], [0.05, 0.5]])
line1 = lines.Line2D(line_x1, line_y1, lw=2., color='k')
ax5.add_line(line1)

line_x2, line_y2 = np.array([[0.05, 0.05], [0.55, 0.9]])
line2 = lines.Line2D(line_x2, line_y2, lw=2., color='k')
ax5.add_line(line2)

ax5.text(0.0, 0.75, "G1")
ax5.text(0.0, 0.25, "G2")

plt.show()


启发,您可以在绘图中创建其他轴,这些轴跨越两个绘图,但只有一个左y轴,没有记号和其他装饰。只设置了一个ylabel。这将使整个事情看起来很协调

好的是,您可以使用现有的熊猫图。缺点是超过15行代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec


df = pd.DataFrame(np.random.rand(26,4), columns=list("ABCD"))
axes = df.plot(subplots=True)
fig = axes[0].figure


gs = gridspec.GridSpec(4,2)
gs.update(left=0.1, right=0.48, wspace=0.05)
fig.subplots_adjust(left=.2)

for i, ax in enumerate(axes):
    ax.set_subplotspec(gs[i,1])

aux1 = fig.add_subplot(gs[:2,0])
aux2 = fig.add_subplot(gs[2:,0])

aux1.set_ylabel("G1")
aux2.set_ylabel("G2")

for ax in [aux1, aux2]:
    ax.tick_params(size=0)
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.set_facecolor("none")
    for pos in ["right", "top", "bottom"]:
        ax.spines[pos].set_visible(False)
    ax.spines["left"].set_linewidth(3)
    ax.spines["left"].set_color("crimson")


plt.show()

如果你只是在标题上加上两个字母怎么办;第一个在A图上面,第二个在C图上面?看看如何做到这一点。@Hami-Hmmm,这将是可视化组的另一种方式(当然除了颜色)。我可能会尝试这样做,但如果知道如何解决上面所示的示例,那将是一件好事,因为这也将允许我(例如)可视化层次聚类。我明白你的观点。请查看我的答案以获得解决方案。可能重复我希望有一个比此更简单的解决方案,但显然这不是
matplotlib
现成的解决方案:D谢谢你!谢谢+1是一个切实可行的解决方案,但我认为最重要的是fBeingernest解决方案看起来更完美(Lib-ish:)谢谢+1,没问题,我必须同意你的意见。我的解决方案是黑客,我们需要干净的代码,所以+1到重要的Beingernest。