【问题标题】:matplotlib savefig() size controlmatplotlib savefig() 大小控制
【发布时间】:2012-10-15 21:35:37
【问题描述】:

我编写了一个函数,它采用从 Pandas 生成的数据框并生成热图:

def drawHeatMap(df, city, province, collector, classtype, color, titleposy):
    try:
        thePlot = pl.matshow(df.values, cmap='PuBuGn')
        pl.colorbar(thePlot, orientation='vertical')
        aTitle = (classtype + ' Composition Changes Over Time in ' + city + 
                ', ' + province + '\n' + collector + ' collector. ' + 'rs100')
        pl.title(aTitle, x=0.5, y=titleposy, style='oblique', weight='bold')
        pl.xlabel('Collection Time')
        pl.xticks(range(len(df.columns)), df.columns, rotation=90)
        pl.yticks(range(len(df.index)), df.index)
        fileName = (classtype + '-' + city + '-' 
                + province + '-' + collector + '.png')
        pl.savefig(fileName)
    except ZeroDivisionError:
        errorMessage = ('No Data Avaiable for ' + city + ', ' + province + 
                ' with ' + collector + ' collector.')
        print errorMessage

我遇到的问题是,savefig() 将保存带有轴和图形修剪的图形。我必须使用show(),最大化图形并自己使用 GUI 按钮手动保存图形。

如何修复我的函数以便savefig() 正确保存图表?我试着在pl.savefig()之前放这样一行来控制我的身材:

       pl.figure(figsize=....) 

但我最终生成了一些空图。编写一个 matplotlib 函数让我完全控制保存图形的正确方法是什么?

更新为问题图示例:

【问题讨论】:

    标签: python matplotlib pandas


    【解决方案1】:

    pl.figure() 命令创建一个新的 matplotlib 图形。图形大小在实例化时设置。您确实想设置图形大小,但您已经有了图形。所以你在正确的轨道上,但试试这个:

    def drawHeatMap(df, city, province, collector, classtype, color, titleposy):
        try:
            fig = pl.figure(figsize=(....))
            ax = fig.add_subplot(111)
            ax.matshow(df.values, cmap='PuBuGn')
            pl.colorbar()
            aTitle = classtype + ' Composition Changes Over Time in ' + city + ', ' + province + '\n' + collector + ' collector. ' + 'rs100'
            ax.set_title(aTitle, x=0.5, y=titleposy, style='oblique', weight='bold')
            ax.set_xlabel('Collection Time')
            ax.set_xticks(range(len(df.columns)), df.columns, rotation=90)
            ax.set_yticks(range(len(df.index)), df.index)
            fileName = classtype + '-' + city + '-' + province + '-' + collector + '.png'
            fig.savefig(fileName)
        except ZeroDivisionError:
            errorMessage = 'No Data Available for ' + city + ', ' + province + ' with ' + collector + ' collector.'
            print errorMessage
    

    【讨论】:

    • 我得到了 AttributeError: 'NoneType' object has no attribute 'autoscale_None'
    • 我改变了代码,所以 thePlot=ax.matshow(df.values, cmap='PuBuGn') pl.colorbar(thePlot,orientation='vertical) 我得到了他的 ValueError: The truth value具有多个元素的数组是不明确的。使用 a.any() 或 a.all()
    • 属性错误不应该是我对您的代码的更改造成的。回溯应该提供更多信息,但看起来您正在尝试访问某个对象的 autoscale_None 属性。
    【解决方案2】:

    简短:
    你只需要打电话给pl.figure(figsize=...)之前你打电话给pl.colorbar(和所有其他的东西)

    解释:
    pl.figure 创建一个 图形(具有给定大小),所有pl.* 方法将在其上执行以下操作。
    所以pl.savefig 只是保存最后创建的图形,如果您在前一行创建了一个新图形,则该图形为空。

    【讨论】:

    • 调用matshow会创建一个figure,所以他实际上需要在matshow之前调用pl.figure()。
    • 我尝试将 pl.figure(...) 放在 pl.colorbar() 之前。它似乎弄乱了我的图表。我认为它以某种方式搞砸了 matshow()
    • 我在 matshow 之前移动了 pl.figure()。有趣的是……如果我不使用 show() 而只是 savefig()。我将保存我的数字(仍然修剪东西)。如果我调用 show() 和 savefig()。它将显示我的图表和一堆空图表
    • 我将 pl.figure() 放在 matshow() 之前 更改 figsize 和 dpi 对保存的图形没有任何作用。
    • 您能否上传一个示例,说明它何时在图形被切断的情况下保存?
    【解决方案3】:

    我在savefig() 之前添加了plt.tight_layout(),它解决了我遇到的修剪问题。也许它也会对你有所帮助。

    编辑:我还在开头rcParams['figure.figsize'] = 40, 12设置了图形大小(您可以设置自己的宽度和高度)

    【讨论】:

    • 我之前尝试过使用tight_layout(),但它从来没有为我工作过。包括 figsize 和 tight_layout() 是我的诀窍。谢谢!
    【解决方案4】:

    documentation,您可以添加dpi 参数来设置分辨率。

    savefig('foo.png', dpi=199)
    

    【讨论】:

      【解决方案5】:

      在致电pl.savefig(fileName) 之前 做plt.tight_layout()

      【讨论】:

        【解决方案6】:

        将图形保存为所需的大小

        figure = plt.gcf()
        figure.set_size_inches(width/100, height/100)
        plt.axis('off')
        plt.plot(x, y, color='black', linewidth=1)
        plt.gca().set_position([0, 0, 1, 1])  
        plt.savefig("image.png", dpi=100)
        

        【讨论】:

          【解决方案7】:

          您可以使用 dpi 参数在 savefig 方法中设置分辨率(以每英寸点数为单位)。所以你可以控制图形大小。 例如,如果您使用以下代码:

          import pandas as pd
          import matplotlib.pyplot as plt
          
          
          df = pd.DataFrame({ 
              'ser1' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] , 
              'ser2' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
              })
          
          df.plot()
          plt.savefig("100.png" , dpi = 100)
          plt.savefig("300.png" , dpi = 300)
          

          100.png 将是:

          100.png

          300.png 将是:

          300.png

          【讨论】:

          • 你能显示代码吗?
          • 我是添加代码
          猜你喜欢
          • 2016-07-02
          • 2012-10-12
          • 1970-01-01
          • 1970-01-01
          • 2013-07-01
          • 2018-01-12
          • 1970-01-01
          • 2011-03-08
          • 1970-01-01
          相关资源
          最近更新 更多