我正在使用以下代码在png图像上绘制数据:
x, y = np.genfromtxt('pogba_t1314.csv', delimiter=',', unpack=True) print(x[1], y[1]) y = y[np.logical_not(np.isnan(y))] x = x[np.logical_not(np.isnan(x))] k = gaussian_kde(np.vstack([x, y])) xi, yi = np.mgrid[x.min():x.max():x.size**0.5*1j,y.min():y.max():y.size**0.5*1j] zi = k(np.vstack([xi.flatten(), yi.flatten()])) fig = plt.figure(figsize=(9,10)) ax1 = fig.add_subplot(211) ax1.pcolormesh(xi, yi, zi.reshape(xi.shape), alpha=0.5) ax1.plot(y,x, "o") ax1.set_xlim(0, 740) ax1.set_ylim(515, 0) im = plt.imread('statszone_football_pitch.png') ax1.imshow(im, extent=[0, 740, 0, 515], aspect='auto')结果如下:
Pcolormesh应该在整个图像上,但事实并非如此。 我该如何设置正确的位置? 为什么我得到更小的pcolormesh尊重整个音高? 我应该有这样的东西(即使这指的是contourf):
I'm plotting data on top of a png image with this code:
x, y = np.genfromtxt('pogba_t1314.csv', delimiter=',', unpack=True) print(x[1], y[1]) y = y[np.logical_not(np.isnan(y))] x = x[np.logical_not(np.isnan(x))] k = gaussian_kde(np.vstack([x, y])) xi, yi = np.mgrid[x.min():x.max():x.size**0.5*1j,y.min():y.max():y.size**0.5*1j] zi = k(np.vstack([xi.flatten(), yi.flatten()])) fig = plt.figure(figsize=(9,10)) ax1 = fig.add_subplot(211) ax1.pcolormesh(xi, yi, zi.reshape(xi.shape), alpha=0.5) ax1.plot(y,x, "o") ax1.set_xlim(0, 740) ax1.set_ylim(515, 0) im = plt.imread('statszone_football_pitch.png') ax1.imshow(im, extent=[0, 740, 0, 515], aspect='auto')Here is the result:
Pcolormesh should be over the whole image, but it is not. How can i set the correct position? Why i get smaller pcolormesh respect of whole pitch? I should have something like this (even if this refers to contourf):
最满意答案
你的代码似乎工作正常。 问题在于,图像中代表x轴的不是你在图中给出的x轴。 也就是说,如果你将x改为y(反之亦然),你将获得正确的情节:
from scipy.stats.kde import gaussian_kde import matplotlib.pyplot as plt import numpy as np x, y = np.genfromtxt('pogba_t1314.csv', delimiter=',', unpack=True) print(x[1], y[1]) y = y[np.logical_not(np.isnan(y))] x = x[np.logical_not(np.isnan(x))] k = gaussian_kde(np.vstack([x, y])) #xi, yi = np.mgrid[x.min():x.max():x.size**0.5*1j,y.min():y.max():y.size**0.5*1j] xi, yi = np.mgrid[y.min():y.max():y.size**0.5*1j,x.min():x.max():x.size**0.5*1j] # Changed this. #zi = k(np.vstack([xi.flatten(), yi.flatten()])) zi = k(np.vstack([yi.flatten(),xi.flatten()])) # And this. fig = plt.figure(figsize=(9,10)) ax1 = fig.add_subplot(111) ax1.pcolormesh(xi, yi, zi.reshape(xi.shape), alpha=0.5) ax1.plot(y,x, "o") ax1.set_xlim(0, 740) ax1.set_ylim(515, 0) im = plt.imread('statszone_football_pitch.jpg') ax1.imshow(im, extent=[0, 740, 0, 515], aspect='auto') plt.show()结果如下:
我猜这是你散乱点的一种密度图。
Your code seems to work fine. The problem is that what represents your x-axis in the image is not what you giving as x-axis in the plot. That said if you change x to y (and vice-versa) you'll obtain the correct plot:
from scipy.stats.kde import gaussian_kde import matplotlib.pyplot as plt import numpy as np x, y = np.genfromtxt('pogba_t1314.csv', delimiter=',', unpack=True) print(x[1], y[1]) y = y[np.logical_not(np.isnan(y))] x = x[np.logical_not(np.isnan(x))] k = gaussian_kde(np.vstack([x, y])) #xi, yi = np.mgrid[x.min():x.max():x.size**0.5*1j,y.min():y.max():y.size**0.5*1j] xi, yi = np.mgrid[y.min():y.max():y.size**0.5*1j,x.min():x.max():x.size**0.5*1j] # Changed this. #zi = k(np.vstack([xi.flatten(), yi.flatten()])) zi = k(np.vstack([yi.flatten(),xi.flatten()])) # And this. fig = plt.figure(figsize=(9,10)) ax1 = fig.add_subplot(111) ax1.pcolormesh(xi, yi, zi.reshape(xi.shape), alpha=0.5) ax1.plot(y,x, "o") ax1.set_xlim(0, 740) ax1.set_ylim(515, 0) im = plt.imread('statszone_football_pitch.jpg') ax1.imshow(im, extent=[0, 740, 0, 515], aspect='auto') plt.show()The result is this:
I guess it's a kind of density plot for your scattered points.
更多推荐
发布评论