我正在使用这个非常简单的代码来测试条形图的创建。
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似乎很简单。
答案 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()
答案 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()