Python-为双y子地块创建两个共享y轴

Python-为双y子地块创建两个共享y轴,python,matplotlib,Python,Matplotlib,目前,我的子批次的第一个y轴(概率)已对齐。但是,我正在尝试对齐子批次的次y轴(样本大小)。我试图简单地设置y轴限制,但这个解决方案不是很普遍 这是我的密码: attacks = 5 crit_rate = .5 idealdata = fullMatrix(attacks, crit_rate) crit_rate = ("crit_%.0f" % (crit_rate*100)) actualdata = trueDataM(attacks, crit_rate) [enter image

目前,我的子批次的第一个y轴(概率)已对齐。但是,我正在尝试对齐子批次的次y轴(样本大小)。我试图简单地设置y轴限制,但这个解决方案不是很普遍

这是我的密码:

attacks = 5
crit_rate = .5

idealdata = fullMatrix(attacks, crit_rate)
crit_rate = ("crit_%.0f" % (crit_rate*100))
actualdata = trueDataM(attacks, crit_rate)
[enter image description here][1]

fig, axs = plt.subplots(attacks+1, sharex=True, sharey=True)
axs2 = [ax.twinx() for ax in axs]

fig.text(0.5, 0.04, 'State', ha='center')
fig.text(0.04, 0.5, 'Probability', va='center', rotation='vertical')
fig.text(.95, .5, 'Sample Size', va='center', rotation='vertical')
fig.text(.45, .9, 'Ideal vs. Actual Critical Strike Rate', va='center')
cmap = plt.get_cmap('rainbow')
samplesize = datasample(attacks, 'crit_50')
fig.set_size_inches(18.5, 10.5)
for i in range(attacks+1):
    axs[i].plot(idealdata[i], color=cmap(i/attacks), marker='o', lw=3)
    axs[i].plot(actualdata[i], 'gray', marker='o', lw=3, ls='--')
    axs2[i].bar(range(len(samplesize[i])), samplesize[i], width=.1, color=cmap(i/attacks), alpha = .6)

plt.show()

如果没有数据来证实我的假设,很难判断这是否正确。 您没有尝试缩放左y轴,以便所有数据都必须具有相同的范围。要确保右y轴的比例/限制相同,需要确定在这些轴上绘制的(所有)数据的范围(最大值和最小值),然后将其应用于所有轴

尚不清楚
samplesize
是一个Numpy ndarray还是一个列表列表,我还假设它是一个具有
范围(攻击+1)
行的二维结构。由于要在第二个y轴上制作条形图,因此只需在所有数据中找到最大的
高度

# for a list of lists
biggest = max(max(row) for row in samplesize)
# or
biggest = max(map(max,samplesize))

# for an ndarray
biggest = samplesize.max()
然后将该比例应用于所有右y轴,然后再显示它们

如果在打印循环之前确定
最大值
,则只需在该循环中添加一行即可:

for i in range(attacks+1):
    ...
    axs2[i].set_ylim(top=biggest)

您会发现大量相关的SO问答搜索,包括以下术语:
matplotlib子地块相同y比例
matplotlib子地块y轴限制
或类似内容


以下是一个玩具示例:

from matplotlib import pyplot as plt
import numpy as np
lines = np.random.randint(0,200,(5,10))
bars = [np.random.randint(0,np.random.randint(0,10000),10) for _ in (0,0,0,0,0,)]

fig, axs = plt.subplots(lines.shape[0], sharex=True, sharey=True)
axs2 = [ax.twinx() for ax in axs]
#xs = np.arange(lines.shape[1])
xs = np.arange(1,11)
biggest = max(map(max,bars))
for ax,ax2,line,row in zip(axs,axs2,lines,bars):
    bars = ax2.bar(xs,row)
    ax.plot(line)
    ax2.set_ylim(top=biggest)

plt.show()
plt.close()

你能把它做成一个好主意吗?您是否在问如何通过编程确定第二个y轴的比例?标准是什么?我正在试图找出一种方法,使子地块的第二个y轴(右侧)相同。到目前为止,第一个y轴(左侧)是相同的。
与什么相同
?左侧的每个y轴共享相同的轴。右侧的y轴不相同。有些在0-30之间,有些在0-400之间。我试图找出一种方法,使右侧的所有y轴都具有相同的范围。当对依赖于数据的代码提出问题时,重要的是在问题中包含最少的数据示例,特别是如果数据来自外部/无法访问的资源。您越容易让我们从您的问题中复制和粘贴(以便我们可以执行您的代码并测试我们的解决方案),您就越有可能得到回复。-如果你用批判的眼光阅读,这是包含在文章中的。您有三个正在绘制的数据集,在您的问题中提供每个数据集的最小示例会很有用。
from matplotlib import pyplot as plt
import numpy as np
lines = np.random.randint(0,200,(5,10))
bars = [np.random.randint(0,np.random.randint(0,10000),10) for _ in (0,0,0,0,0,)]

fig, axs = plt.subplots(lines.shape[0], sharex=True, sharey=True)
axs2 = [ax.twinx() for ax in axs]
#xs = np.arange(lines.shape[1])
xs = np.arange(1,11)
biggest = max(map(max,bars))
for ax,ax2,line,row in zip(axs,axs2,lines,bars):
    bars = ax2.bar(xs,row)
    ax.plot(line)
    ax2.set_ylim(top=biggest)

plt.show()
plt.close()