import random
import matplotlib.pyplot as plt
num1 = 30
num3 = [4000,3000,1500,9000,2500,8000,1200,800,900,1000,5400,9500,1100,3400,8100,
5500,1200,3830,2311,9999]
#num3_array = []
num2_array = []
for i in range (0,20):
num2 = random.randrange(0,45)
print(num2)
#num3_array.append(num3)
num2_array.append(num2)
plt.axvline(num1,0,color="r")
plt.scatter(num2_array,num3,marker=",")
我想在x轴上有num2值,在y轴上有相应的num3值。我不知道如何得到它。我一直收到错误。
ValueError: x and y must be the same size
我知道这意味着什么。我只是不知道如何解决它。
另外,我需要图表中的文字。我想指向红线并说出#34; num1 = 30",然后计算红线左侧和右侧的散点数,并将计数放在右侧手的一角图。在红线上被认为是在右侧。
上面的图片是我使用excel创建的。我需要的是使用matplotlib在RHS角落的那个盒子。该方框在LHS和RHS上有点数。
答案 0 :(得分:0)
我对这个程序的第一个改变是将y值的长度与'x'值的长度相匹配,这可以让你开始绘图:
num2 = []
for i in range (len(num3)):
num2.append(random.randrange(0,45))
print(num2)
plt.plot(num2, num3)
plt.show()
答案 1 :(得分:0)
为了绘制来自x
和y
坐标可迭代的散点图,两个迭代必须具有相同的长度。如果x
iterable比y
长,则y
坐标应该是多少x
个坐标(反之亦然)?
import random
import matplotlib.pyplot as plt
num1 = 30
num3 = [4000,3000,1500,9000,2500,8000,1200,800,900,1000,5400,9500,1100,3400,8100,
5500,1200,3830,2311,9999]
num2_array = []
for _ in num3:
num2 = random.randrange(0,45)
print(num2)
num2_array.append(num2)
plt.axvline(num1,0,color="r")
plt.scatter(num2_array,num3,marker=",")
plt.show()
这现在可以正常工作,但是numpy为我们提供了一个更好(更快,更清晰等)的方法来使用numpy.random.random_integers函数。
import random
import matplotlib.pyplot as plt
import numpy as np
num1 = 30
num3 = [4000,3000,1500,9000,2500,8000,1200,800,900,1000,5400,9500,1100,3400,8100,
5500,1200,3830,2311,9999]
num2_array = np.random.random_integers(0,45,len(num3))
plt.axvline(num1,0,color="r")
plt.scatter(num2_array,num3,marker=",")
plt.show()
要计算红线左侧的点数,您可以执行以下操作:
count = 0
for value in num2_array:
if value <= num1:
count += 1
要在图上写下这个计数,你需要查看matplotlib的annotating plots的各种方法。您可以使用text
方法绘制计数文本,并告诉matplotlib使用轴坐标系,以便始终在左上角绘制。您还需要使用annotate函数来绘制带箭头的注释。完整的示例如下
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid.anchored_artists import AnchoredText
fig = plt.figure()
ax = fig.add_subplot(111)
num1 = 30
num3 = [4000,3000,1500,9000,2500,8000,1200,800,900,1000,5400,9500,1100,3400,8100,
5500,1200,3830,2311,9999]
num2_array = np.random.random_integers(0,45,len(num3))
count = 0
for value in num2_array:
if value <= num1:
count += 1
ax.axvline(num1,0,color="r")
ax.scatter(num2_array,num3,marker=",")
ax.text(x=0.85,y=0.95,s="Count: {}".format(count), transform=ax.transAxes)
ax.annotate("Text", xy=(num1, max(num3)/2), xytext=(num1*1.2, (max(num3)/2)*1.2), arrowprops=dict(facecolor='black'))
plt.show()