使用matplotlib pyplot绘制对数y轴的条形图程序语法

4

我知道这个问题以前就被问过了(Python Pyplot Bar Plot bars disappear when using log scale),但是给出的答案对我没有用。 我设置了pyplot.bar(x_values, y_values, etc, log = True),但是出现了一个错误,内容如下:

"TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'"

我一直在寻找一个真实的pyplot代码示例,它使用了y轴设置为对数的条形图,但是我没有找到。我做错了什么吗?

以下是代码:

import matplotlib.pyplot as pyplot
ax = fig.add_subplot(111)
fig = pyplot.figure()
x_axis = [0, 1, 2, 3, 4, 5]
y_axis = [334, 350, 385, 40000.0, 167000.0, 1590000.0]
ax.bar(x_axis, y_axis, log = 1)
pyplot.show()

我即使删除pyplot.show也会出错。提前感谢您的帮助。

1
请展示完整的回溯信息。 - tacaswell
3个回答

7
你确定你的代码只有这些内容吗?代码在哪里抛出错误?在绘图过程中吗?因为以下代码对我有效:
In [16]: import numpy as np
In [17]: x = np.arange(1,8, 1)
In [18]: y = np.exp(x)

In [20]: import matplotlib.pyplot as plt
In [21]: fig = plt.figure()
In [22]: ax = fig.add_subplot(111)
In [24]: ax.bar(x, y, log=1)
Out[24]: 
[<matplotlib.patches.Rectangle object at 0x3cb1550>,
 <matplotlib.patches.Rectangle object at 0x40598d0>,
 <matplotlib.patches.Rectangle object at 0x4059d10>,
 <matplotlib.patches.Rectangle object at 0x40681d0>,
 <matplotlib.patches.Rectangle object at 0x4068650>,
 <matplotlib.patches.Rectangle object at 0x4068ad0>,
 <matplotlib.patches.Rectangle object at 0x4068f50>]
In [25]: plt.show()

这里是情节: 在这里输入图片描述
(注:该内容涉及IT技术,为保证准确性,建议提供更具体的上下文信息。)

当代码到达ax.bar(x, y, log=1)时,会抛出错误。由于某种原因,它仍然无法正常工作。 - physics_researcher

4

正如在Greg的答案评论中已经建议的那样,您确实看到了一个问题,该问题通过将默认行为设置为“clip”而在matplotlib 1.3中得到了修复。对我来说,升级到1.3可以解决这个问题。

请注意,似乎无论您如何应用对数比例尺,无论是作为bar的关键字参数还是通过轴上的set_yscale,都没有关系。

另请参见这个回答“python中的对数y轴bin”,该回答提供了这个解决方法:

plt.yscale('log', nonposy='clip')

1
错误是由于log = True语句在ax.bar(...中引起的。我不确定这是matplotlib的错误还是它被用于意外的方式。可以通过删除有问题的参数log=True来轻松解决。
这可以通过自己记录y值来简单地解决。
x_values = np.arange(1,8, 1)
y_values = np.exp(x_values)

log_y_values = np.log(y_values)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(x_values,log_y_values) #Insert log=True argument to reproduce error

需要添加适当的标签log(y),以明确它是对数值。


问题在于当我将y轴设置为对数时,条形图没有被填充。 - physics_researcher
我已经在编辑中解决了这些问题。我承认它不像记录x轴那样漂亮,但仍然可以肯定的是错误来自于“log=True”参数。 - Greg
我猜我可以手动设置轴标签-这是一个临时解决办法,但我仍然困惑为什么log=True会给我错误。 - physics_researcher
Justin,这可能是matplotlib的一个bug。我刚在我的工作电脑上使用了matplotlib 1.3重新尝试了一下,log=True可以正常工作。你用的是哪个版本?也许值得安装1.3版本 - Greg

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