回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我在用matplotlib.pyplot用几个小插画出一个情节。这是我最终想要的:一个2x2数组的“主要”情节。每个曲线图中都有两条曲线,每个曲线使用不同的y轴。另外,我想在每一个小插画。在</p>
<p>到目前为止,我已经得到了第一部分,使用以下示例代码:</p>
<pre><code>import matplotlib.pyplot as plt
import numpy as np
import os
import shutil
import time
import sys
#Simplest working example of tight_layout and plots problem
def two_scales(ax1, time, data1, data2, c1, c2, xlabel, y1label, y2label):
ax2 = ax1.twinx()
ax1.plot(time, data1, color=c1)
ax1.set_xlabel(xlabel)
ax1.set_ylabel(y1label)
ax2.plot(time, data2, color=c2)
ax2.set_ylabel(y2label)
return ax1, ax2
# Change color of each axis
def color_y_axis(ax, color):
"""Color your axes."""
for t in ax.get_yticklabels():
t.set_color(color)
return None
def insetPlots():
t = np.arange(0.01, 10.0, 0.01)
#Figure stuff
fig, baseAxes = plt.subplots(2,2,figsize=(10, 6))
baseAxesFlattened = baseAxes.flatten()
for i, dat in enumerate(baseAxesFlattened):
s1 = np.exp((i+1)*t)
s2 = .3*np.sin((i+1)*.2 * np.pi * t)
#Plotting them together
tempAx1, tempAx2 = two_scales(baseAxesFlattened[i], t, s1, s2, 'b', 'r','heyheyhey','yayaya','woopwoop')
#Changing the color of the axes
color_y_axis(tempAx1, 'b')
color_y_axis(tempAx2, 'r')
plt.tight_layout()
#plt.figure(figsize=(6, 8))
picname="/mypath/testtesttest.png"
plt.savefig(picname)
insetPlots()
</code></pre>
<p>这就产生了,目前为止还不错:</p>
<p><a href="https://i.stack.imgur.com/Y6YG9.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Y6YG9.png" alt="enter image description here"/></a></p>
<p>现在我要添加插图。我可以很容易地做到:</p>
^{pr2}$
<p>请注意,这里我注释掉了tight_layout()。这会产生这样的结果,在我想要的位置有插入图:</p>
<p><a href="https://i.stack.imgur.com/ibf2k.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ibf2k.png" alt="enter image description here"/></a></p>
<p>因此,这使插入图处于正确的位置,但由于tight_layout()已不存在,主绘图的轴标签是重叠的。如果我有tight_layout()(因此,与上面的代码完全相同,但该行未加注释),我得到:</p>
<p><a href="https://i.stack.imgur.com/2bvnW.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/2bvnW.png" alt="enter image description here"/></a></p>
<p>主要情节的轴不再重叠,但插图现在处于错误的位置。我运行代码时也会收到以下警告:</p>
<pre><code>/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:2022: UserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect.
warnings.warn("This figure includes Axes that are not compatible "
</code></pre>
<p>我怎样才能使它们都工作呢?我怀疑我做了一些简单的错误,比如把插图放错了地方。在</p>
<p>编辑:我已经找到了一个解决办法,但这很难看,我希望不是“恰当”的方法。我怀疑tight_layout()正在移动对象,因此在tight_layout()之后,插入图的位置(取决于主要图块的位置)相对于主要图块的位置变得混乱。所以我解决了这个问题,绘制了主要的图,做了紧凑的布局,然后添加了插入的:</p>
<pre><code>import matplotlib.pyplot as plt
import numpy as np
import os
import shutil
import time
import sys
#Simplest working example of tight_layout and plots problem
def two_scales(ax1, time, data1, data2, c1, c2, xlabel, y1label, y2label):
ax2 = ax1.twinx()
ax1.plot(time, data1, color=c1)
ax1.set_xlabel(xlabel)
ax1.set_ylabel(y1label)
ax2.plot(time, data2, color=c2)
ax2.set_ylabel(y2label)
return ax1, ax2
# Change color of each axis
def color_y_axis(ax, color):
"""Color your axes."""
for t in ax.get_yticklabels():
t.set_color(color)
return None
def insetPlots():
t = np.arange(0.01, 10.0, 0.01)
#Figure stuff
fig, baseAxes = plt.subplots(2,2,figsize=(10, 6))
baseAxesFlattened = baseAxes.flatten()
majorAxes = []
for i, dat in enumerate(baseAxesFlattened):
s1 = np.exp((i+1)*t)
s2 = .3*np.sin((i+1)*.2 * np.pi * t)
#Plotting them together
tempAx1, tempAx2 = two_scales(baseAxesFlattened[i], t, s1, s2, 'b', 'r','heyheyhey','yayaya','woopwoop')
majorAxes.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(tempAx1)
#Changing the color of the axes
color_y_axis(tempAx1, 'b')
color_y_axis(tempAx2, 'r')
plt.tight_layout()
for i, dat in enumerate(baseAxesFlattened):
tempAx1 = majorAxes[i]
pos = tempAx1.get_position()
#print(pos)
posString = str(pos)
x0Ind, y0Ind, x1Ind, y1Ind = posString.find('x0'),posString.find('y0'),posString.find('x1'),posString.find('y1')
#print(x0Ind, y0Ind, x1Ind, y1Ind)
x0, y0, x1, y1 = float(posString[x0Ind+3:y0Ind-2]), float(posString[y0Ind+3:x1Ind-2]), float(posString[x1Ind+3:y1Ind-2]), float(posString[y1Ind+3:-1])
#print(x0, y0, x1, y1)
mainPlotW = x1 - x0
mainPlotH = y1 - y0
w, h = 0.3*mainPlotW, 0.25*mainPlotH
left, bottom, width, height = [x0 + .15*mainPlotW, y0 + .7*mainPlotH, w, h]
insetAx = fig.add_axes([left, bottom, width, height])
#insetAx.plot(range(6)[::-1], color='green')
s3 = np.sin(.2 * np.pi * t/(i+1))
insetAx.plot(t,s3, color='green')
#plt.tight_layout()
#plt.figure(figsize=(6, 8))
picname="/mypath/testtesttest.png"
plt.savefig(picname)
insetPlots()
</code></pre>
<p><a href="https://i.stack.imgur.com/RXgKa.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/RXgKa.png" alt="enter image description here"/></a></p>
<p>有没有更干净的方法?在</p>