首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管使用plt.savefig“紧”,但bbox_inches=()还是部分地从彩色条标签中获取下标字符。

尽管使用plt.savefig“紧”,但bbox_inches=()还是部分地从彩色条标签中获取下标字符。
EN

Stack Overflow用户
提问于 2020-12-30 12:43:38
回答 1查看 537关注 0票数 0

我有一个图形,在主图的x轴下方有一个标有标签的色条。当我试图使用plt.savefig()保存它时,标签中下标字符的最底部是从保存的图像中剪切出来的,就像一样,尽管使用了bbox_inches=“紧密”。但是,如果我只需在弹出窗口中手动保存该数字,就不会像那样裁剪下标字符。

虽然后一个映像可以手动裁剪,或者使用代码中的其他行进行裁剪,但我希望您能就如何解决这个问题提出建议,而无需进行额外的工作。

我试图在彩色条标签上添加一个断线符,如下所示:

代码语言:javascript
复制
label="$U/U_{"+(u"\u221e")+"}$\n"

但这只是在标签下面添加了空白;下标字符的底部仍在裁剪。

我还试图增加以下内容:

代码语言:javascript
复制
cb.set_label(label,labelpad=5)

但这只是抵消了标签从底部的彩条;没有额外的填充在标签之下,以充分显示下标字符。

守则如下:

代码语言:javascript
复制
import numpy
import random
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.colors as mcolors
import matplotlib.colorbar as cbar
from matplotlib import cm

##########################################################
#  Centre colourmap so 0=white
class MidpointNormalize(mpl.colors.Normalize):
    def __init__(self,vmin=None,vmax=None,midpoint=None,clip=False):
        self.midpoint=midpoint
        mpl.colors.Normalize.__init__(self,vmin,vmax,clip)
    def __call__(self,value,clip=None):
        x,y=[self.vmin,self.midpoint,self.vmax],[0,0.5,1]
        return numpy.ma.masked_array(numpy.interp(value,x,y),numpy.isnan(value))
##########################################################

# Set min and max values
xymin=0
xymax=10
valmin=-5
valmax=5
val=numpy.zeros((xymax,xymax),dtype=float)

# Configure plot
fig,ax=plt.subplots()
ax.set_xlim([xymin,xymax])
ax.set_ylim([xymin,xymax])

# Configure colour bar
colours=plt.cm.RdBu(numpy.linspace(0,1,256)) 
colourmap=mcolors.LinearSegmentedColormap.from_list('colourmap',colours)
normalisecolors=mpl.colors.Normalize(vmin=valmin,vmax=valmax)
scalecolors=cm.ScalarMappable(norm=normalisecolors,cmap=colourmap)
label="$U/U_{"+(u"\u221e")+"}$"

for ix in range(xymin,xymax):
    for iy in range(xymin,xymax):
        xlow=ix*+1          # Calculate vertices of patch
        xhigh=(ix*1)+1
        ylow=iy*1
        yhigh=(iy*1)+1
        val[ix][iy]=random.randint(valmin,valmax)   # Patch value
        rgbacolor=scalecolors.to_rgba(val[ix][iy])  # Calculate RGBA colour for value
        ax.add_patch(patches.Polygon([(xlow,ylow),(xlow,yhigh),(xhigh,yhigh),(xhigh,ylow)],fill=True,facecolor=rgbacolor))  # Add value as polygon patch

cax,_=cbar.make_axes(ax,orientation="horizontal") 
cb=cbar.ColorbarBase(cax,cmap=colourmap,norm=MidpointNormalize(midpoint=0,vmin=valmin,vmax=valmax),orientation="horizontal",label=label)
plt.savefig("C:/Users/Christopher/Desktop/test.png",dpi=1200,bbox_inches="tight")
plt.clf
plt.close()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-30 13:46:36

恐怕我没有很好的答案给你。这似乎与此bug https://github.com/matplotlib/matplotlib/issues/15313有关。

好消息是,它正在进行中,坏消息是,目前还没有解决办法。

无论如何,有两点需要考虑(基于阅读github上的线程):

  • dpi越高,情况就越糟。因此,您可能希望保存在较低的dpi (300工作对我来说很好)
  • 这个问题不存在于pdf后端,所以您可以将您的地块保存在pdf中(如果需要,最终可以转换为png )。

顺便说一句(这与问题中的bug无关):我对代码的复杂性感到困惑。在我看来,下面的代码产生了相同的输出:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import TwoSlopeNorm

N=10
valmin=-5
valmax=5
valmid=0
val=np.random.randint(low=valmin, high=valmax, size=(N,N))
cmap = 'RdBu'
norm = TwoSlopeNorm(vcenter=valmid, vmin=valmin, vmax=valmax)
label="$U/U_{"+(u"\u221e")+"}$"

# Configure plot
fig, ax=plt.subplots()
im = ax.imshow(val, cmap=cmap, norm=norm, aspect='auto', origin='lower')
cbar = fig.colorbar(im, orientation='horizontal', label=label)
fig.savefig('./test-1200.png',dpi=1200,bbox_inches="tight")  # subscript is cut
fig.savefig('./test-300.png',dpi=300,bbox_inches="tight")  # subscript is not cut
fig.savefig('./test-pdf.pdf',dpi=1200,bbox_inches="tight")  # subscript is not cut

1200 dpi:

300 dpi:

pdf:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65507159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档