当前位置: 首页 > 知识库问答 >
问题:

matplotlib-子图中的twinx轴没有xtag和xticks

韩阳云
2023-03-14

我想做的是在子地块中创建一个2x2图表。然后,对于每个图形,我将使用两个y轴。因此,我对每个图都使用了twinx()方法。您在我共享的图中看到的问题是,它没有显示第一行的xlabel和xtick。第二排,一切正常。我在图中用红色字体指定了这个问题(“没有xlabel和xticks!!!”)。

每个图都有自己的x轴和y轴,没有共享。

我对这段代码做了很多调整,缩小了问题制造者的范围。这是因为我在上面的行中使用了twinx()。如果我尝试删除次y轴,所有内容都会恢复正常,并且上面行的xlabel和ylabel都会正确显示。

我不知道是什么问题!

这是我正在编写的代码。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from io import StringIO

s = StringIO(u"""     amount     price
A     40929   4066443
B     93904   9611272
C    188349  19360005
D    248438  24335536
E    205622  18888604
F    140173  12580900
G     76243   6751731
H     36859   3418329
I     29304   2758928
J     39768   3201269
K     30350   2867059""")

df = pd.read_csv(s, index_col=0, delimiter=' ', skipinitialspace=True)

fig = plt.figure() 

ax_2 = fig.add_subplot(222, sharex=None, sharey=None) 
ax_22 = ax_2.twinx()
ax_2.plot([1, 3, 5, 7, 9])
ax_22.plot([1.0/x for x in [1, 3, 5, 7, 9]])
ax_2.set_xlabel("AX2 X Lablel")
ax_2.set_ylabel("AX2 Y Lablel")
ax_22.set_ylabel("AX2_Twin Y Lablel")


ax_2 = fig.add_subplot(223, sharex=None, sharey=None) 
ax_22 = ax_2.twinx()
ax_2.plot([100, 300, 500, 700, 900])
ax_22.plot([x*x for x in [100, 300, 500, 700, 900]])
ax_2.set_xlabel("AX3 X Lablel")
ax_2.set_ylabel("AX3 Y Lablel")
ax_22.set_ylabel("AX3_Twin Y Lablel")




ax_2 = fig.add_subplot(224, sharex=None, sharey=None) 
ax_22 = ax_2.twinx()
ax_2.set_xlabel("AX4 X Lablel")
ax_2.set_ylabel("AX4 Y Lablel")
ax_22.set_ylabel("AX4_Twin Y Lablel")






ax = fig.add_subplot(221, sharex=None, sharey=None) 
ax2 = ax.twinx() 
width = 0.4
df.amount.plot(kind='bar', color='red', ax=ax, width=width, position=1, sharex=False, sharey=False)
df.price.plot(kind='bar', color='blue', ax=ax2, width=width, position=0, sharex=False, sharey=False)

ax.set_xlabel("Alphabets")
ax.set_ylabel('Amount')
ax2.set_ylabel('Price')



plt.subplots_adjust(wspace=0.8, hspace=0.8)
plt.savefig("t1.png", dpi=300)
plt.show()

它生成如下图:

编辑:

谢谢你的回答。然而,我的问题仍然存在,当使用熊猫绘制图表。我提出了一个新问题。请看一下:

matplotlib-熊猫-子图中双轴无xlabel和XTICK

共有2个答案

苏选
2023-03-14

您提供的代码似乎产生了所需的结果。

这使我认为您的控制台或matplotlib版本存在问题-也许您可以提供有关如何运行代码的更多信息。

我建议将ax.set_xlabel移到twinx之前,例如:

ax_2 = fig.add_subplot(222, sharex=None, sharey=None)
ax_22 = ax_2.twinx()
ax_2.set_xlabel("AX2 X Lablel")
ax_2.plot([1, 3, 5, 7, 9])

# Becomes...

ax_2 = fig.add_subplot(222, sharex=None, sharey=None)
ax_2.set_xlabel("AX2 X Lablel")
ax_2.plot([1, 3, 5, 7, 9])
ax_22 = ax_2.twinx()

编辑我建议使用gridspec代替。见下面的工作示例

import matplotlib.pyplot as plt
import matplotlib.gridspec as gspec
import numpy as np

fig = plt.figure()
gs = gspec.GridSpec(2, 2)
gs.update(hspace=0.7, wspace=0.7)
ax1 = plt.subplot(gs[0, 0])
ax2 = plt.subplot(gs[1, 0])
ax3 = plt.subplot(gs[0, 1])
ax4 = plt.subplot(gs[1, 1])


x1 = np.linspace(1,10,10)

ax1.plot(x1, x1**2)
ax1.set_xlabel('ax1 x')
ax1_2 = ax1.twinx()
ax1_2.plot(x1, x1**3)
ax1_2.set_ylabel('ax1_2 y')
ax1.set_ylabel('ax1 y')

# To save time I left the other cells blank, but it should work fine.

plt.show()

上述情况产生了以下结果:

王航
2023-03-14

这就是我处理像这样的问题的方式。首先尝试通过将代码减少到最低限度来隔离问题。例如,这段代码显示了同样的问题:

fig = plt.figure()
fig.add_subplot(212)
ax = fig.add_subplot(211)
ax2 = ax.twinx()
pd.Series(range(10)).plot(ax=ax)

现在我们可以看到两件事:

>

  • 如果我只在5行代码中犯了一个错误,那么应该很容易找到(至少比原始代码容易)。由于我找不到任何错误,我想这是熊猫或matplotlib中的一个错误。从注释来看,这可能是matplotlib 1.5.1中引入的回归。

    此代码中有两个不寻常的地方:

    • 下部打印在上部打印之前创建。

    不寻常的事情更有可能触发底层库中隐藏的错误,所以如果可能的话,最好避免它们。现在让我们看看如果我们按照通常的自上而下的顺序创建子情节会发生什么:

    fig = plt.figure() 
    ax = fig.add_subplot(211)
    ax2 = ax.twinx()
    pd.Series(range(10)).plot(ax=ax)
    fig.add_subplot(212)
    

    这似乎是可行的,所以让我们对原始代码进行同样的尝试:

    fig = plt.figure() 
    
    ax = fig.add_subplot(221, sharex=None, sharey=None) 
    ax2 = ax.twinx() 
    width = 0.4
    df.amount.plot(kind='bar', color='red', ax=ax, width=width, position=1, sharex=False, sharey=False)
    df.price.plot(kind='bar', color='blue', ax=ax2, width=width, position=0, sharex=False, sharey=False)
    
    ax_2 = fig.add_subplot(222, sharex=None, sharey=None) 
    ax_22 = ax_2.twinx()
    ax_2.plot([1, 3, 5, 7, 9])
    ax_22.plot([1.0/x for x in [1, 3, 5, 7, 9]])
    ax_2.set_xlabel("AX2 X Lablel")
    ax_2.set_ylabel("AX2 Y Lablel")
    ax_22.set_ylabel("AX2_Twin Y Lablel")
    
    ax_2 = fig.add_subplot(223, sharex=None, sharey=None) 
    ax_22 = ax_2.twinx()
    ax_2.plot([100, 300, 500, 700, 900])
    ax_22.plot([x*x for x in [100, 300, 500, 700, 900]])
    ax_2.set_xlabel("AX3 X Lablel")
    ax_2.set_ylabel("AX3 Y Lablel")
    ax_22.set_ylabel("AX3_Twin Y Lablel")
    
    ax_2 = fig.add_subplot(224, sharex=None, sharey=None) 
    ax_22 = ax_2.twinx()
    ax_2.set_xlabel("AX4 X Lablel")
    ax_2.set_ylabel("AX4 Y Lablel")
    ax_22.set_ylabel("AX4_Twin Y Lablel")
    
    ax.set_xlabel("Alphabets")
    ax.set_ylabel('Amount')
    ax2.set_ylabel('Price')
    
    plt.subplots_adjust(wspace=0.8, hspace=0.8)
    plt.savefig("t1.png", dpi=300)
    plt.show()
    

    所以这个问题通过一个变通办法解决了(至少对我来说)。一个实际的修复会更好,但完美是好的敌人,现在子图是按照更合理的顺序创建的,这提高了可读性。

  •  类似资料:
    • 问题内容: 我想做的是在子图中的2x2图。然后,对于每个图形,我将使用两个y轴。因此,我为每个图使用twinx()方法。正如您在我共享的图中看到的那样,问题是它没有在第一行显示xlabel和xticks。对于第二行,一切都很好。我在图中用红色字体指定了问题(“没有xlabel和xticks !!!”)。 每个图都有自己的x轴和y轴,因此没有共享之处。 我已经对该代码进行了很多调整,并缩小了造成问题

    • 在一些应用场景中,有时需要绘制两个 x 轴或两个 y 轴,这样可以更直观地显现图像,从而获取更有效的数据。Matplotlib 提供的 twinx() 和 twiny() 函数,除了可以实现绘制双轴的功能外,还可以使用不同的单位来绘制曲线,比如一个轴绘制对函数,另外一个轴绘制指数函数。 下面示例绘制了一个具有两个 y 轴的图形,一个显示指数函数 exp(x),另一个显示对数函数 log(x)。 输

    • 问题内容: 我刚刚使用突触软件包系统在Ubuntu 9.10中安装了matplotlib。但是,当我尝试以下简单示例时 我没有绘图窗口。关于如何显示绘图窗口的任何想法? 问题答案: 您可以输入 或更好,请使用。 由于 不再建议使用,因此如今的解决方案是

    • 问题内容: 我试图用风玫瑰的4个子图制作一个人物,但是我意识到风玫瑰只有这样的轴:那么,我如何用风玫瑰画一个子图? 问题答案: 有两种解决方案: (a)从矩形创建轴 首先,这里已经存在一个类似的问题:如何将特定轴添加到matplotlib子图中? 在那里,解决方案是在图中创建一个具有新子图轴坐标的矩形,然后调用 一个更容易理解的例子是 (b)添加投影 现在创建该矩形可能会很烦人,并且能够使用mat

    • 问题内容: 我有一个使用两个y轴的图。我还给行加了标签,并想用显示,但我仅成功获得了图例中一个轴的标签: 因此,我只得到图例中第一个轴的标签,而不是第二个轴的标签“ temp”。如何将第三个标签添加到图例? 问题答案: 你可以通过添加以下行轻松添加第二个图例: 你将获得: 但是,如果要将所有标签都放在一个图例上,则应执行以下操作:

    • 我想使用Matplotlib绘制一个带有非均匀x轴的直方图。例如,考虑下面的直方图: 第一个箱子的密度很高,所以我想放大。 理想情况下,我想将x轴中的值更改为,保持图中的箱宽度不变(当然不是数字)。有没有简单的方法来实现这一点?欢迎任何意见或建议。