How to change the linewidth of hatch in matplotlib?

后端 未结 4 1164
执笔经年
执笔经年 2021-02-05 08:47

Is there a way to increase the width of hatch in matplotlib?

For example, the following code by specifying linewidth only changes the width of the edge. I

相关标签:
4条回答
  • 2021-02-05 08:51

    If you use pdf and have sudo rights you can change it in backend_pdf.py. There is a line

    self.output(0.1, Op.setlinewidth)
    

    Usually it is located in /usr/lib/pymodules/python2.7/matplotlib/backends/backend_pdf.py .

    Also someone wrote a hack to do this from your script (still need sudo rights to execute). Solution from here: http://micol.tistory.com/358

    import os
    import re
    import matplotlib
    
    def setHatchThickness(value):
    libpath = matplotlib.__path__[0]
    backend_pdf = libpath + "/backends/backend_pdf.py"
    with open(backend_pdf, "r") as r:
        code = r.read()
        code = re.sub(r'self\.output\((\d+\.\d+|\d+)\,\ Op\.setlinewidth\)',
                       "self.output(%s, Op.setlinewidth)" % str(value), code)
        with open('/tmp/hatch.tmp', "w") as w:
            w.write(code)
        print backend_pdf
        os.system('sudo mv /tmp/hatch.tmp %s' % backend_pdf)
    
    
    setHatchThickness(1.0)
    
    0 讨论(0)
  • 2021-02-05 08:56

    There is a solution which is very hacky, but allows you to do what you want without changing matplotlib internal files: you can monkey patch the writeHatches of PdfFile like so:

    
    # make sure you have the correct imports,
    # they may differ depending on the matplotlib version
    import matplotlib.backends.backend_pdf
    from matplotlib.externals import six
    from matplotlib.backends.backend_pdf import Name, Op
    from matplotlib.transforms import Affine2D
    
    def setCustomHatchWidth(customWidth):
    
         def _writeHatches(self):
            COPY CODE FROM matplotlib.__path__[0] + "/backends/backend_pdf.py" HERE
            change the line 
                self.output(0.1, Op.setlinewidth)
            to 
                self.output(customWidth, Op.setlinewidth)
    
        matplotlib.backends.backend_pdf.PdfFile.writeHatches = _writeHatches
    

    You can then do

    setCustomWidth(2)
    

    before saving you figure as pdf.

    0 讨论(0)
  • 2021-02-05 09:00

    I have a workaround that may help some. I use this when making my final plots for reports. The width of the hatch is affected by the dpi setting in

    plt.savefig('pic',dpi=300)
    

    The following figure is done at 80 DPI

    Then again at 400 DPI

    I fully understand that this may introduce other issues, but I figured it is worth the mention.

    0 讨论(0)
  • 2021-02-05 09:09

    As of matplotlib version 2.0, you can directly change the linewidth parameter, as follows:

    import matplotlib as mpl
    mpl.rcParams['hatch.linewidth'] = 0.1  # previous pdf hatch linewidth
    mpl.rcParams['hatch.linewidth'] = 1.0  # previous svg hatch linewidth
    

    This seems a better workaround than what folks have above. You can check the matplotlib version by:

    import matplotlib as mpl
    print(mpl.__version__) # should be 2.x.y
    
    0 讨论(0)
提交回复
热议问题