与这个问题非常相似,但不同之处在于我的身材可以达到需要的大小.
我需要在matplotlib中生成一堆垂直堆叠的图.结果将使用figsave保存并在网页上查看,因此我不关心最终图像的高度,只要子图间隔开,这样它们就不会重叠.
无论我有多大的数字,子图总是似乎重叠.
我的代码目前看起来像
import matplotlib.pyplot as plt
import my_other_module
titles, x_lists, y_lists = my_other_module.get_data()
fig = plt.figure(figsize=(10,60))
for i, y_list in enumerate(y_lists):
plt.subplot(len(titles), 1, i)
plt.xlabel("Some X label")
plt.ylabel("Some Y label")
plt.title(titles[i])
plt.plot(x_lists[i],y_list)
fig.savefig('out.png', dpi=100)
Run Code Online (Sandbox Code Playgroud) 另一个线程的解决方案建议使用gridspec.GridSpec而不是plt.subplots.但是,当我在子图之间共享轴时,我通常使用如下语法
fig, axes = plt.subplots(N, 1, sharex='col', sharey=True, figsize=(3,18))
Run Code Online (Sandbox Code Playgroud)
我如何指定sharex以及sharey何时使用GridSpec?
比方说,matplotlib xlabels中有3行子图,其中一行可以与下一行的标题重叠.一个人必须摆弄pl.subplots_adjust(hspace),这很烦人.
是否有一个配方hspace可以防止重叠并适用于任何nrow?
""" matplotlib xlabels overlap titles ? """
import sys
import numpy as np
import pylab as pl
nrow = 3
hspace = .4 # of plot height, titles and xlabels both fall within this ??
exec "\n".join( sys.argv[1:] ) # nrow= ...
y = np.arange(10)
pl.subplots_adjust( hspace=hspace )
for jrow in range( 1, nrow+1 ):
pl.subplot( nrow, 1, jrow )
pl.plot( y**jrow )
pl.title( 5 * ("title %d " % jrow) ) …Run Code Online (Sandbox Code Playgroud) 我正在尝试绘制一个矩阵来比较一些数据。但情节的标题与子情节重叠:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sn
def save_graph_cm(CMatrix):
# CMatrix is a dict with four 3x3 pandas DataFrame
k = 'Wine'
id = 0
cm = 1
plt.suptitle("#" + str(id) + " Confusion Matrix for " + k + " dataset")
for c_matrix in CMatrix:
plt.subplot(2, 2, cm)
sn.heatmap(CMatrix[c_matrix], annot=True, cmap="YlOrRd")
plt.title("CV - " + str(cm-1))
plt.xlabel("Predicted Classes")
plt.ylabel("Real Classes")
cm += 1
plt.tight_layout()
plt.show
Run Code Online (Sandbox Code Playgroud)
我现在得到的是:
我想最小化我的图形周围的空白,但不确定如何 a) 为我的图像周围的 savefig 命令精确指定一个边界框,以及 b) 为什么紧布局命令在我的工作示例中不起作用。
在我当前的示例中,我在我的对象/补丁周围设置了一个轴环境(紧密到黄色对象和蓝色框几乎分别在左侧和底部被切断)。但是,这仍然给我左侧和底部的空白:

但是,在这种情况下,我不确定如何摆脱空白。我认为可以像讨论的那样指定边界框Matplotlib tiny_layout() 不考虑图形 suptitle 而是插入
fig.tight_layout(rect=[0.1,0.1,0.9, 0.95]),
Run Code Online (Sandbox Code Playgroud)
我知道如何通过插入一个填充整个图形等的轴对象来绕过这个,但这感觉就像一个愚蠢的黑客。有没有一种简单快捷的方法来做到这一点?
我的代码是:
import matplotlib
from matplotlib import pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
from matplotlib.collections import PatchCollection
from matplotlib.patches import FancyBboxPatch
plt.ion()
fig, ax=plt.subplots(1)
ax.set_xlim([-0.38,7.6])
ax.set_ylim([-0.71,3.2])
ax.set_aspect(0.85)
#objects
circs2=[]
circs2.append( patches.Circle((-0.3, 1.225), 0.1,ec="none"))
circs2.append( patches.RegularPolygon ((-0.3,1.225+1.5),4, 0.1) )
coll2 = PatchCollection (circs2,zorder=10)
coll2.set_facecolor(['yellow', 'gold'])
ax.add_collection(coll2)
#squares
p_fancy=FancyBboxPatch((0.8,1.5),1.35,1.35,boxstyle="round,pad=0.1",fc='red', ec='k',alpha=0.7, zorder=1)
ax.add_patch(p_fancy)
x0=4.9
p_fancy=FancyBboxPatch((1.15+x0,-0.6),0.7*1.15,0.7*1.15,boxstyle="round,pad=0.1", fc='blue', ec='k',alpha=0.7, zorder=1) …Run Code Online (Sandbox Code Playgroud) 我试图在suptitle多面板图形上方进行调整,但在弄清楚如何调整figsize字体并随后放置字幕时遇到了麻烦。
问题在于调用plt.suptitle("my title", y=...)调整字幕的位置也会调整图形尺寸。几个问题:
suptitle(..., y=1.1)标题实际放在哪里?据我所知,ysuptitle参数的文档指向matplotlib.text.Text,但是当您有多个子图时,我不知道图形坐标的含义。
什么是对数字的大小指定时的效果y来suptitle?
如何手动调整图形尺寸和间距(subplots_adjust?),以在每个面板中添加图形标题和整个图形的字幕,同时保持图形中每个斧头的大小?
一个例子:
data = np.random.random(size=100)
f, a = plt.subplots(2, 2, figsize=(10, 5))
a[0,0].plot(data)
a[0,0].set_title("this is a really long title\n"*2)
a[0,1].plot(data)
a[1,1].plot(data)
plt.suptitle("a big long suptitle that runs into the title\n"*2, y=1.05);
Run Code Online (Sandbox Code Playgroud)
显然,我每次做一个图形时都可以进行调整,但是我需要一个通常不需要人工干预就能解决的解决方案。我已经尝试过受限布局和紧凑布局。都无法可靠地处理任何复杂的图形。