作为演示,我正在绘制x ^ 0到x ^ 9,x值在10到20之间。
然后我将这些图像切片,以便我有9个切片:
x =(10至11),(11至12)等等至(18至19)
我希望我的图像被裁剪,以便y值始终在每个切片中从上到下展开,但我得到的是自动缩放始终缩放到完整数据集而不是当前切片。
import matplotlib.pyplot as plt
import numpy as np
# create some test data
for i in range(10):
x = np.arange(10,20)
y = x**i
plt.plot(x,y,c='red',marker='.',ms=2)
# get all x values in chart and reduce to a sorted list set
xd = []
for n in range(len(plt.gca().get_lines())):
line = plt.gca().get_lines()[n]
xd.append((line.get_xdata()).tolist())
xd = [item for sublist in xd for item in sublist]
xd = sorted(list(set(xd)))
# attempt to plot slices of x with autoscaled y
ax = plt.gca()
for i in range(len(xd)-1):
ax.set_xlim([xd[i],xd[i+1]])
ax.axes.autoscale(enable=True,axis='y', tight=True)
plt.pause(1) #timing
#uncommenting the next line will create nine tiny (6kb) image files
#plt.savefig(('image_%s.png' % i), bbox_inches=0, dpi=48)
在我的实际应用中,我尝试以这种方式从随机数据中生成10万个微小图像作为数据库。对于每x,有2到200 y的值。然后我使用OpenCV将新图像与历史数据库中的最佳图像匹配。
关键是在每个图像中y值从上到下拉伸,以便OpenCV找到一个很好的匹配。
如果它有助于我的x值始终是int()类型并且等间距
ETA:我试图在这里实施一些解决方案,但没有取得任何进展:
Matplotlib - fixing x axis scale and autoscale y axis
Matplotlib scale y axis based on manually zoomed x axis
但至少我已经了解到:
自动缩放始终使用全部数据,因此y轴是 根据y数据的全部范围进行缩放,而不仅仅是y数据中的内容 的x的限制。
虽然
仍然没有解决方案def autoscale_y()
给了我:
h = np.max(y_displayed) - np.min(y_displayed)
ValueError: zero-size array to reduction operation maximum which has no identity
从这些链接中,我不确定在我的for循环中在哪里实施@Joe Kington的掩码解决方案。
我现在正在使用这里提出的@bernie解决方案来获得Y值:X:
How to extract points from a graph?
然后我可以set_ylim()手动给出那个X的最小和最大Y值?
如果有一种方法可以在定义的xlim中作为标准matplotlib方法进行自动缩放,那么这将更加容易
答案 0 :(得分:0)
我昨晚解决了我的问题,创建了一个字典,其中x为键,y为y值。
当数据由函数y = x ** i
创建时,会发生这种情况本质上我正在创建字典结构伪代码:
data[x0] = [x0y1,x0y2,x0y3....]
data[x1] = [x1y1,x1y2,x1y3....]
data[x2] = [x2y1,x2y2,x2y3....]
etc.
我稍后可以在任何给定的x处引用所有y值。从那里,找到切片左侧和右侧的最小和最大y值,以手动设置ylim。如果您的xlim切片超过一个x段宽,则必须为xlim中的每个相应x切片重复该过程。在我的例子中,我的x切片恰好是一个段宽。
import matplotlib.pyplot as plt
import numpy as np
# move my range function out of my data creation loop
x = np.arange(10,20,1)
# create a dictionary of my data with x values as keys
data = {}
for i in range(len(x)):
data[x[i]]=[]
# create some test data
for i in range(10):
y = x**i
plt.plot(x,y,c='red',marker='.',ms=2)
# store my y data to my data dictionary as its created
xx = x[-len(y):]
for j in range(len(xx)):
data[xx[j]].append(y[j])
# get all x values in chart and reduce to a sorted list set
xd = []
for n in range(len(plt.gca().get_lines())):
line = plt.gca().get_lines()[n]
xd.append((line.get_xdata()).tolist())
xd = [item for sublist in xd for item in sublist]
xd = sorted(list(set(xd)))
# attempt to plot slices of x with autoscaled y
ax = plt.gca()
for i in range(len(xd)-1):
ax.set_xlim([xd[i],xd[i+1]])
# reference my min and max y values by left and right borders of x slice
ymin = min(min(data[xd[i]]), min(data[xd[i+1]]))
ymax = max(max(data[xd[i]]), max(data[xd[i+1]]))
# manually set y limits
ax.set_ylim([ymin,ymax])
#eliminate my autoscale call
#ax.axes.autoscale(enable=True,axis='y', tight=True)
plt.pause(1) #timing
现在绘制时,y会自动缩放到x切片,而不是整个数据集。