x和y与绘图的大小不同。并且需要图表

时间:2016-04-16 22:56:03

标签: python matplotlib

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",然后计算红线左侧和右侧的散点数,并将计数放在右侧手的一角图。在红线上被认为是在右侧。

enter image description here 上面的图片是我使用excel创建的。我需要的是使用matplotlib在RHS角落的那个盒子。该方框在LHS和RHS上有点数。

2 个答案:

答案 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)

为了绘制来自xy坐标可迭代的散点图,两个迭代必须具有相同的长度。如果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()