Matplotlib: отображение диаграммы рассеяния поверх изображения с правильным порядком и размером - PullRequest
0 голосов
/ 19 июня 2020

У меня есть некоторые координаты, которые я хочу отобразить поверх изображения с нужным размером и метками осей. Координаты от -750 до +750 по оси X и от -400 до +450 (не +400) по оси Y выглядят следующим образом:

[('-397.91', '58.91'), ('-569.73', '179.18'), ('-461.73', '306.82'), ('-199.09', '186.55'), ('-348.82', '-169.36'), ('-125.45', '-243.00'), ('4.64', '-267.55'), ('110.18', '-265.09'), ('267.27', '-12.27'), ('-687.55', '390.27')]

Изображение, которое будет используется в качестве фона:

Background image to be used

Предполагаемый результат выглядит примерно так: (Кроме того, в верхнем левом кармане есть мяч до девяти видимых на экране.)

Actual picture

Для этого я написал следующее.

#Conversion of dataframe to array of tuples:
plotdata = list(data.to_records(index=False)) #data is the dataframe of coordinates
print(plotdata)

img = plt.imread("American-style pool table diagram.png")
fig = plt.figure(figsize = (15, 9))
fig, ax = plt.subplots()
fig.set_size_inches(15, 9)
ax.imshow(img, extent=[-750, 750, -400, 450], zorder=1)
x, y = zip(*plotdata)
plt.scatter(x, y, data=data, color='red', zorder=2)

Я смотрю две проблемы.

  1. Когда строка ax.imshow(img, extent=[-750, 750, -400, 450], zorder=1) закомментирована, чтобы показать только координаты, я получаю все координаты по прямой линии (вероятно, в том порядке, в котором они появляются в plotdata list) вместо предполагаемых местоположений. Выглядит это так:

Wrong Order

Когда код запускается как таковой, когда изображение отображается под графиком, метки осей искажаются, и вся диаграмма рассеяния сжимается до крошечной области в центре изображения.

Super-Compressed

Что может быть проблемой с соотношением сторон изображения и как это исправить, чтобы точки отображались должным образом в нужных местах поперек изображения?

1 Ответ

1 голос
/ 19 июня 2020

Первая проблема, с которой вы столкнулись, это то, что вы создали 2 изображения. В остальном код работает нормально. Проблема с вашими точками данных в том, что они являются строками. Но их легко преобразовать в floats. Следует моему коду и выводить:

import random
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot
import numpy as np
import matplotlib.pyplot as plt


#Conversion of dataframe to array of tuples:

data = [('-397.91', '58.91'), ('-569.73', '179.18'), ('-461.73', '306.82'), ('-199.09', '186.55'), ('-348.82', '-169.36'), ('-125.45', '-243.00'), ('4.64', '-267.55'), ('110.18', '-265.09'), ('267.27', '-12.27'), ('-687.55', '390.27')]
x = [float(i[0]) for i in data]
y = [float(i[1]) for i in data]
img = plt.imread(r"dir\icons\planet.png")
fig, ax = plt.subplots()
fig.set_size_inches(15, 9)
im=ax.imshow(img, extent=[-750, 750, -400, 450], zorder=1)
ax.scatter(x, y, color='red', zorder=2, s=100)
plt.show()

example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...