【问题标题】:How to draw two different subplots using matplotlib adjacent to each other?如何使用彼此相邻的matplotlib绘制两个不同的子图?
【发布时间】:2020-11-14 11:35:38
【问题描述】:

我有两个不同的情节,第一个是Frequency vs Features,另一个是Frequency vs Yield Loss。

每个图都是一个条形图,带有一条趋势线,在 Y 轴的右侧显示累积百分比或收益率损失。

因此,对于每个图表,X 轴显示特征名称,左侧 Y 轴显示频率,右侧 Y 轴显示累积百分比或收益率损失。

这是我编写的代码,它显示了以下输出。

#Trendline_change_2
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots()
ax1 = df.iloc[:HOW_MANY,:]['FailCount'].plot(kind="bar",stacked = True,legend=False,figsize=(8,8), label = 'frequency plot',color = 'green',title="Frequency of failure vs Feature")  #Graph naming changes
ax1.set_ylabel('Frequency', color='b')
ax1.tick_params('y', colors='b')
ax1.set_xticklabels(np.asarray(df['Feature'])[:HOW_MANY])

ax2 = ax1.twinx()
ax2.plot(np.asarray(df['Cummulative_aggr'])[:HOW_MANY],linestyle='--', marker='s',label ='cummulative %', color='r')
ax2.set_ylabel('Cummulative %', color='r')

plt.legend(loc='best')

#Plot 2

fig, ax1 = plt.subplots()
ax1 = df.iloc[:HOW_MANY,:]['FailCount'].plot(kind="bar",stacked = True,legend=False,figsize=(8,8), label = 'frequency plot',color = 'green',title="Frequency of failure vs Feature")  #Graph naming changes
ax1.set_ylabel('Frequency', color='b')
ax1.tick_params('y', colors='b')
ax1.set_xticklabels(np.asarray(df['Feature'])[:HOW_MANY])

ax2 = ax1.twinx()
ax2.plot(np.asarray(df['Yield_Loss'])[:HOW_MANY],linestyle='--', marker='s',label ='Yield Loss', color='black')
ax2.set_ylabel('Yield Loss', color='black')


plt.legend(loc='best')
plt.tight_layout()
plt.show()

一切都很好除了我想并排更改两个地块而不是另一个地块

我尝试了一些方法来将它们并排设置,例如 plt.subplot(1,2,1) 和其他参数,但结果并不令人满意。

谁能帮我调整一下?我知道我很接近,但无法做到正确。

【问题讨论】:

  • 您的代码将创建两个数字。为什么您的示例输出显示子图?您是否在像 Jupyter 或类似环境中工作,内联绘图让您认为您有一个图形的两个子图?
  • @Mr.T 嗨。实际上我想要两个像我附上的图像一样的数字。只希望它们比一个低于另一个相邻。你也是对的,我确实在使用 Jupyter notebook。
  • 现在变得混乱了。 matplotlib 中的图形是与子图不同的实体。您可以在一个图中有多个子图,您可以在 matplotlib 中安排这些子图。或者您可以在每个图中有一个子图 - 但要排列这些图,您必须指示控制输出的程序,在您的情况下似乎是 Jupyter。这两个问题(“如何在 matplotlib 中排列子图”和“如何在 Jupyter 中排列图形”)是不同的,因为答案会有所不同。那么,你有哪个问题?我添加了标签Jupyter,以防是第二个问题。
  • @Mr.T 如果让我感到困惑,我很抱歉。让我简单地说,我希望两个子图并排排列。累积百分比和收益率损失之一。为了获得累积百分比图,我从#Trendline_change_2 编码到#plot 标签,对于下图,代码从#plot 2 开始。在每个图中,我有一个条形图,左轴为频率,一个显示趋势的线和带有右 Y 轴的地图。这对于两个地块都是一样的。我希望我没有用错术语。

标签: python pandas matplotlib jupyter


【解决方案1】:

似乎带有内联图像显示的 Jupyter 环境让人很难理解为什么数字和子图不一样。您的问题的 matplotlib 答案已经给出 - create subplots 并填写:

import matplotlib.pyplot as plt
import numpy as np

#Figure 1, 2 subplots
fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(10,5))

#subplot 1
ax1.plot(np.arange(10), np.random.randint(1, 5, 10), c="blue")
ax2 = ax1.twinx()
ax2.plot(np.arange(5, 15), np.random.randint(10, 100, 10), c="red", label="Subplot 1")
plt.legend(loc="best")

#subplot 2
ax4 = ax3.twinx()
ax3.plot(np.arange(10), np.random.randint(2,20, 10), c="grey")
ax4.plot(np.arange(5, 15), np.random.randint(-10, 0, 10), c="yellow", label="Subplot 2")

#now plot both subplots into one figure
plt.legend(loc="best")
plt.tight_layout()
plt.show()

这将创建一个带有两个子图的图形(想想一个窗口或页面):

您的方法是创建两个单独的图形,每个图形包含一个子图:

import matplotlib.pyplot as plt
import numpy as np

#Figure 1
fig, ax1 = plt.subplots()
ax1.plot(np.arange(10), np.random.randint(1, 5, 10), c="blue")
ax2 = ax1.twinx()
ax2.plot(np.arange(5, 15), np.random.randint(10, 100, 10), c="red", label="Figure 1")
plt.legend()


#Figure 2
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(np.arange(10), np.random.randint(2,20, 10), c="grey")
ax2.plot(np.arange(5, 15), np.random.randint(-10, 0, 10), c="yellow", label="Figure 2")
plt.legend()
plt.show()

正如预期的那样,这将创建两个数字。在我的环境中,这是两个窗口:

在您的环境中(在这里猜测,因为我不知道 Jupyter),内联打印将两个图形放在不同的行上 - 因此,它们看起来好像您在 matplotlib 中创建了两个垂直排列的子图。
总之,这似乎是一个 Jupyter 问题 - “我如何并排绘制内联图像?”,而不是 matplotlib 问题,如果我理解正确的话。话虽如此 - 回答“如何在 matplotlib 中安排子图”这个问题不是更容易吗? (你已经得到了几个答案),然后只画一个数字?很难理解为什么需要两个图形然后并排显示它们。

【讨论】:

  • 嗨。我想你给了我一个正确的方向,经过一些改变,我觉得我更接近了。结束这个问题,标记你的正确(我需要根据我的需要进行定制)。非常感谢。
【解决方案2】:

通常fig, (ax1, ax2) = plt.subplots(1, 2) 应该可以正常工作。然后像以前一样使用 ax1 和 ax2 创建图形。
Documentation

【讨论】:

  • 我不确定我是否完全明白你在说什么。这是我所做的更改 link 和输出 [链接] (imgur.com/a/jTSr6Wa)。您能指出在哪里进行正确的更改吗?
  • 好的,这样更好,但是你只需要一个图,(ax1, ax2) = plt.subplots(1, 2),因为你粘贴了两次你有 4 个图。然后使用 ax1 创建第一个图,使用 ax2 创建第二个图。
【解决方案3】:

使用

fig, (ax1, ax2) = plt.subplots(1,2)
plt.subplots(a,b)

a - 每列的地块数

b - 每行的地块数

https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.pyplot.subplots.html

查看上述文档以获得更好的理解。

【讨论】:

  • 我不确定我是否完全明白你在说什么。这是我所做的更改 link 和输出 [链接] (imgur.com/a/jTSr6Wa)。您能指出在哪里进行正确的更改吗?
  • 我检查了你的代码,我想你已经写了两次相同的代码。删除“”“”#Plot 2“”“”下的代码(重复),然后重试一次。
猜你喜欢
  • 2020-07-24
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 2017-05-22
  • 2021-04-14
  • 1970-01-01
相关资源
最近更新 更多