Python 使用光栅化=True时,Matplotlib绘图(pcolormesh和colorbar)相对于其轴移动

Python 使用光栅化=True时,Matplotlib绘图(pcolormesh和colorbar)相对于其轴移动,python,matplotlib,colorbar,Python,Matplotlib,Colorbar,我使用matplotlibpcolormeshplots with colorbars,对plots和colorbars应用光栅化,以减小文件大小并将图形保存为PDF文件。因此,我注意到,光栅化后,颜色区域本身相对于轴向上和向左移动了一点,因此在绘图的下边缘和右边缘出现了白色条纹。同样的情况也发生在色条上,我发现更糟糕的是:对于薄色条,白色条纹非常明显且令人不安。是否有办法避免光栅化绘图的这种行为,并将光栅化区域保持在与光栅化之前相同的位置 我试着玩光栅化\u zorder和zorder设置。它

我使用matplotlib
pcolormesh
plots with colorbars,对plots和colorbars应用光栅化,以减小文件大小并将图形保存为PDF文件。因此,我注意到,光栅化后,颜色区域本身相对于轴向上和向左移动了一点,因此在绘图的下边缘和右边缘出现了白色条纹。同样的情况也发生在色条上,我发现更糟糕的是:对于薄色条,白色条纹非常明显且令人不安。是否有办法避免光栅化绘图的这种行为,并将光栅化区域保持在与光栅化之前相同的位置

我试着玩
光栅化\u zorder
zorder设置
。它对
pcolormesh
绘图有点帮助(较低的白色条纹消失了),但我找不到方法将其应用到
colorbar

下面是一个简单的例子,有四个图说明了这个问题。请放大图右下角的PDF文件,看看我的意思

    import numpy as np
    import matplotlib.pyplot as plt

    d = np.arange(100).reshape(10, 10)

    myfig = plt.figure(figsize=(5, 5)) 

    '''plot 1, no rasterization'''
    ax1 = plt.subplot(221)
    plot1 = ax1.pcolormesh(d)
    cbar1 = plt.colorbar(plot1)
    ax1.set_title("no rasterization", fontsize = 10)

    '''plot 2, main plot rasterized, colorbar not'''
    ax2 = plt.subplot(222)
    plot2 = ax2.pcolormesh(d, rasterized=True)
    cbar2 = plt.colorbar(plot2)
    ax2.set_title("plot rasterized", fontsize = 10)

    '''plot 3, main plot and colorbar rasterized'''
    ax3 = plt.subplot(223)
    plot3 = ax3.pcolormesh(d, rasterized=True)
    cbar3 = plt.colorbar(plot3)
    cbar3.solids.set_rasterized(True)  # !!!!!!!! 
    ax3.set_title("plot and cbar rasterized", fontsize = 10)

    '''plot 4, whole axes of main plot and colorbar rasterized, attempt to use rasterization_zorder'''
    ax4 = plt.subplot(224)
    ax4.set_rasterization_zorder(-10)
    plot4 = ax4.pcolormesh(d, zorder=-20)
    '''colorbarbar gets its own axis'''
    from mpl_toolkits.axes_grid1.inset_locator import inset_axes
    ax_cbar4 = inset_axes(ax4,  width="3%", height="100%", loc=6)
    ax_cbar4.set_rasterization_zorder(-10)
    locator_ax_cbar4 =ax_cbar4.get_axes_locator()
    locator_ax_cbar4.set_bbox_to_anchor ((1.0, 0 , 1, 1),  ax4.transAxes)
    cbar4=plt.colorbar(plot4, cax=ax_cbar4)

    #cbar4.solids.set_rasterization_zorder(-10) # ---> NOT WORKING 
    cbar4.solids.set_rasterized(True)

    ax4.set_title("axes rasterized and zorder changed", fontsize = 10)


    plt.savefig("D:/test_rasterization_3plots.pdf", dpi=150)
    print 'pdf file saved'

    plt.show()


如有任何建议,将不胜感激

这是一个在1.2.0和1.2.1之间修复的bug(可能是这个:,我把跟踪修复问题的提交留给读者作为练习;)


最简单的解决方案是升级到1.2.1或更高版本。

您使用的mpl版本是什么?我无法(在主机上)复制此内容。我正在使用带Win7 64位的matplotlib 1.2.0。我所说的问题只出现在保存的pdf绘图中,而不是matplotlib的图形窗口中。谢谢生成的pdf在1.3.x、2.7和linux上看起来很好。你能发布一个示例pdf的链接吗?生成的pdf和演示放大的图像可以在中找到,它对你有用吗?因此,如果pdf在Linux上看起来不错,那么还有一个切换的理由,但这需要时间……非常感谢,升级帮助很大!