Matplotlib bar()函数总是引发Error

时间:2018-01-23 16:20:06

标签: python python-3.x matplotlib

我正在使用这个非常简单的代码来测试条形图的创建。

import numpy as np
import matplotlib.pyplot as plt
vec = np.random.uniform(-1,1,size=(1,10))
plt.bar(range(len(vec)), vec, linewidth=1)

此代码总是引发

TypeError: only size-1 arrays can be converted to Python scalars

在做与linewidth相关的事情时,无论我传入什么价值,或者根本没有。

我的matplotlib版本是2.1.0。这可能是什么问题? bar的API似乎很简单。

3 个答案:

答案 0 :(得分:1)

使vec成为一维数组:

vec = np.random.uniform(-1,1,size=10)

vec = np.random.uniform(-1,1,size=(1,10))使vec成为具有形状(1,10)的2D数组 - 即具有1行和10列的数组。 plt.bar期望height可以是常量或一维标量序列。

height : scalar or sequence of scalars
         the height(s) of the bars
import numpy as np
import matplotlib.pyplot as plt
vec = np.random.uniform(-1,1,size=10)
plt.bar(range(len(vec)), vec, linewidth=1)
plt.show()

enter image description here

答案 1 :(得分:1)

您正在尝试绘制二维数组。它需要1-D阵列 这是编辑后的代码

import numpy as np
import matplotlib.pyplot as plt
vec = np.random.uniform(-1,1,size=(10)) #changed the size part
plt.bar(range(len(vec)), vec, linewidth=1)

答案 2 :(得分:1)

此处vec = np.random.uniform(-1,1,size=(1,10))创建一个形状(1,10)的数组。该错误告诉您要提供给bar的数组应该是1D而不是2D。

直接的解决方案是首先不创建2D阵列。

import numpy as np
import matplotlib.pyplot as plt
vec = np.random.uniform(-1,1,size=(10))

plt.bar(range(len(vec)), vec, linewidth=1)
plt.show()

如果你已经拥有这样一个数组,解决办法就是从中选择第一行(也是唯一一行)进行绘制。

import numpy as np
import matplotlib.pyplot as plt
vec = np.random.uniform(-1,1,size=(1,10))
vec1D= vec[0]
plt.bar(range(len(vec1D)), vec1D, linewidth=1)
plt.show()