subplot_adjust()对pyplot轴做了什么?

时间:2014-12-08 21:33:15

标签: python-2.7 matplotlib subplot

我试图在pyplot图中绘制几个子图,其中一个有两个子图。我通过根据底部位置创建一个额外的pyplot.ax来处理这个问题。

现在,当我使用fig.subplots_adjust()调整轴1到4时会出现问题,以便为图例留出额外的空间。在下面的图片中,您可以看到虽然我的两个数据集的长度相同,但条形图会向右延伸。

我想在使用ax5时对fig.subplot_adjust()应用与其他四个轴相同的调整,但我无法弄清楚这个方法在做什么 matplotlib.axes.Axes个实例。

查看文档,我找不到适合我目的的方法: http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes

那么fig.subplot_adjust()对我的斧头做了什么?如何重现此行为以使所有轴对齐?

import numpy as np
import matplotlib.pyplot as plt
import datetime

fig, ( ax1, ax2, ax3 , ax4) = plt.subplots( figsize=(18.0, 11.0) , nrows=4, ncols=1) 

## some fake stand-alone data
days = 365 * 5
dates = [datetime.datetime(2000, 1, 1, 0, 0) + datetime.timedelta( day - 1) for day in range(days)]
data_series = np.random.rand( days )
data_series2 = [np.sin(x * 2 * np.pi / 365 ) + np.random.rand(1) * 0.1 for x in range( days ) ]

######  Plots made up temperatures 
ax4.set_frame_on(False)
ax4.plot_date( dates , data_series2 , color="black", ls="solid", lw=2, ms=0 )

# Now on the same plot try to add som precipitation as a plot
ax5 = fig.add_axes(ax4.get_position() , frameon=True, zorder = -10.0)
ax5.bar( dates, data_series, edgecolor="blue", zorder = -10.0 )
ax5.xaxis_date()

# gets rid of bar-plot labels
ax5.set_xticks([]); ax5.set_yticks([])

fig.subplots_adjust(right=0.8) # <- Pandora's box
plt.show()

enter image description here

1 个答案:

答案 0 :(得分:1)

这里的问题是ax5不在子图中。

fig.get_axes()

[<matplotlib.axes._subplots.AxesSubplot at 0x220175c0>,
<matplotlib.axes._subplots.AxesSubplot at 0x18d48240>,
<matplotlib.axes._subplots.AxesSubplot at 0x1c5f3630>,
<matplotlib.axes._subplots.AxesSubplot at 0x1a430710>,
<matplotlib.axes._axes.Axes at 0x1c4defd0>] # There is ax5 and it is not under _subplots

所以当你这样做时

fig.subplots_adjust(right=0.8)

你直接调整子图而不是斧头,这样你就不会影响ax5。

一种简单的纠正方法是在调用ax5之前调整ax4,因此ax5的比例与ax4相同。

致电

fig.subplots_adjust(right=0.8)

之前

ax5 = fig.add_axes(ax4.get_position() , frameon=True, zorder = -10.0)

您将获得正确的输出。

所以你的代码必须看起来像那样;

import numpy as np
import matplotlib.pyplot as plt
import datetime

fig, ( ax1, ax2, ax3 , ax4) = plt.subplots( figsize=(18.0, 11.0) , nrows=4, ncols=1) 

## some fake stand-alone data
days = 365 * 5
dates = [datetime.datetime(2000, 1, 1, 0, 0) + datetime.timedelta( day - 1) for day in range(days)]
data_series = np.random.rand( days )
data_series2 = [np.sin(x * 2 * np.pi / 365 ) + np.random.rand(1) * 0.1 for x in range( days ) ]

######  Plots made up temperatures 
ax4.set_frame_on(False)
ax4.plot_date( dates , data_series2 , color="black", ls="solid", lw=2, ms=0 )

# I move the subplot_adjust here before you create ax5
fig.subplots_adjust(right=0.8) 

# Now on the same plot try to add som precipitation as a plot
ax5 = fig.add_axes(ax4.get_position() , frameon=True, zorder = -10.0)
ax5.bar( dates, data_series, edgecolor="blue", zorder = -10.0 )
ax5.xaxis_date()

# gets rid of bar-plot labels
ax5.set_xticks([]); ax5.set_yticks([])

plt.show()