【问题标题】:How to change the linewidth of hatch in matplotlib?如何更改 matplotlib 中影线的线宽?
【发布时间】:2015-04-09 21:37:37
【问题描述】:

有没有办法增加 matplotlib 中影线的宽度?

例如,下面的代码通过指定linewidth只改变边缘的宽度。我想更改用于填充的线的线宽。

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randn(100)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(x, fill=False, hatch='/', linewidth=2)

plt.show()

【问题讨论】:

标签: python numpy matplotlib


【解决方案1】:

从matplotlib 2.0版本开始,可以directly change the linewidth parameter,如下:

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

这似乎比上面的人更好的解决方法。您可以通过以下方式检查 matplotlib 版本:

import matplotlib as mpl
print(mpl.__version__) # should be 2.x.y

【讨论】:

  • 这应该是公认的答案。奇怪的是,这个设置是如此受限制/无法使用 API 命令进行配置。
【解决方案2】:

如果您使用 pdf 并拥有 sudo 权限,您可以在 backend_pdf.py 中更改它。有一条线

self.output(0.1, Op.setlinewidth)

通常位于 /usr/lib/pymodules/python2.7/matplotlib/backends/backend_pdf.py 。

还有人用你的脚本写了一个 hack 来做到这一点(仍然需要 sudo 权限才能执行)。来自这里的解决方案: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)

【讨论】:

  • 我根据您的第一个建议临时修改了backend_pdf.py 中的行。这是一个很好的解决方法,直到可以使用关键字参数对其进行修改。
【解决方案3】:

有一个非常hacky的解决方案,但允许您在不更改matplotlib内部文件的情况下做您想做的事情:您可以像这样修改PdfFile的writeHatches:


# 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

你可以这样做

setCustomWidth(2)

在将您的图保存为 pdf 之前。

【讨论】:

    【解决方案4】:

    我有一个可能对某些人有所帮助的解决方法。我在为报告制作最终图时使用它。影线的宽度受 dpi 设置的影响

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

    下图是在80 DPI下完成的

    然后 再次以 400 DPI

    我完全理解这可能会引入其他问题,但我认为值得一提。

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2013-12-06
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2012-03-31
      相关资源
      最近更新 更多