I am trying to plot points between ranges but it is not coming out well due to my lack of plotting library knowledge.If you look at the diagram below, sometimes my data is shown outside the rectangles i.e.ranges. My data is formatted as below:
d = {(x, y, [values between x and y]), (x, y, [values between x and y]) ....}
d = {(10, 15, [1, 4, 4, 4, 4, 4]), (20, 25, [4, 5, 5, 5, 5, 5])....}
The blue spots are the values between the ranges and rectangles are the ranges along with dashed line which is the reference line.
My current code looks like below:
from random import randint
from random import randrange, uniform
import numpy as np
from matplotlib.path import Path
import matplotlib.patches as patches
import matplotlib.pyplot as plt
def plotResults(d, referenceLine):
''' d is of type {(x, y, [values between x and y]), (x, y, [values between x and y])}'''
#remap (x, y) points to start from 0
gap = 10
start, end = 0, 0
remap = []
maxValue = 0
for k, val in d.items():
x, y = k
start = end + gap
end = start + (y - x)
maxValue = end * 2
remap.append((start, end, val))
#draw the vertical rectangles
vertices = []
codes = []
prev = 0
for i in range(len(remap)):
codes += [Path.MOVETO] + [Path.LINETO]*3
vertices += [(remap[i][0]+prev, 0), (remap[i][0]+prev, 8), (remap[i][1]+prev, 8), (remap[i][1]+prev, 0)]
prev = remap[i][1] + gap
path = Path(vertices, codes)
pathpatch = patches.PathPatch(path, facecolor='None', edgecolor='green')
fig, ax = plt.subplots()
#draw the points inside the rectangles
for i in range(len(remap)):
p = 0
for j in range(remap[i][1]-remap[i][0]):
mm = remap[i][2]
circ = plt.Circle((remap[i][0]+j + prev, mm[p]), 0.1, color='b', alpha=0.3)
ax.add_patch(circ)
p += 1
prev = remap[i][1] + gap
#draw the referenceLine
x = np.linspace(0, maxValue, 500)
y = [referenceLine for i in range(len(x))]
line1, = ax.plot(x, y, '--', linewidth=0.5)
ax.add_patch(pathpatch)
ax.autoscale_view()
plt.show()
#generate the dataset of ranges with the values inside those ranges
referenceLine = 4
d = {}
start, end, gap = 0, 0, 10
for i in range(10):
duration = randrange(40, 60)
start = end + gap
end = start + duration
d[(start, end)] = [randint(0, 7) for j in range(end-start)]
print(start, end)
plotResults(d, referenceLine)
Is there any better way to do this?


ax.plotand feed it arrays of x- and y-values