双换行符在使用matplotlib和xkcd风格时无效。

6
以下是一段 Python3 代码,因为第 9 行有换行符,所以无法正常工作:
# -*- coding: utf-8 -*-
from matplotlib import pyplot as plt
import numpy as np

plt.xkcd()

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.text(4, 400, '-> 1 Pig ~ 150 kg\n\n-> Butching => 80 to 100 kg meat')
plt.axis([0, 7, 0, 2000])
plt.plot([0,1,2,3,4,5], [0,400,800,1200,1600, 2000])
ax.set_ylim([0, 2000])
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.show()

但是,如果我删除plt.xkcd()这一行,则即使有双重换行符,一切也会正常工作。 有人知道原因吗? 这是一个bug还是有任何解决方法?

我的设置: Windows 7 amd64, python 3.3, numpy 1.8, matplotlib 1.3.1


如果您删除双换行符,它是否与plt.xkcd行一起使用?您确定是因为双重换行符吗?由于我的matplotlib版本过低而无法复制,因此会在plt.xkcd()处产生错误。 - usethedeathstar
@mutzmatron 我修复了他的代码,错误已经正确报告了...我在这里重现了它。 - Saullo G. P. Castro
我在 GitHub 上的 matplotlib 问题跟踪器中打开了这个问题... (https://github.com/matplotlib/matplotlib/issues/2687) - Saullo G. P. Castro
自从1.3版本以来,“xkcd”已成为“matplotlib”的标准组件。我也可以重现这个错误(通过删除双行间断或“plt.xkcd()”来解决)。 - David Zwicker
1个回答

1

解决此问题的两个技巧:

  • 将双换行符替换为“\n.\n”(即添加一个小点)

    plt.text(4, 400, '-> 1头猪〜150公斤\n.\n-> 屠宰 => 80到100公斤的肉')
    
  • 将多行文本拆分为多个text调用(最佳结果)

    plt.text(4, 400, '-> 1头猪〜150公斤')
    plt.text(4, 240, '-> 屠宰 => 80到100公斤的肉')
    

    或者

    text = '-> 1头猪〜150公斤\n\n-> 屠宰 => 80到100公斤的肉'
    for il, l in enumerate(text.split('\n')):
        plt.text(4, 400-80*il, l)
    

你的第一个例子有问题,因为它包含了点号。即使在这些换行符之间加上安全的空格(\xA0),也不会起作用。另外两个例子是好的,但是它们不能随着我的文本大小进行缩放,所以这不是一个终极解决方案。 - Tik0
同意 - 如果要进行更完整的修复,您可以添加textsize参数并使用它来缩放间距(而不是我使用的任意值80)。再次强调,这些主要是特定问题的解决方法,而不是值得添加到matplotlib代码库中的bugfixes :) - jmetz
如果你只是在\n之间放置一个空格,会发生什么? - tacaswell
@tcaswell:尝试过了,不起作用 - 最后一行没有显示出来。 - jmetz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接