Чтение определенных строк и построение графика с использованием Matplotlib

avatar
VAISHAKH THOLAN
8 августа 2021 в 21:44
128
1
1

У меня есть лист Excel со столбцом кадров изображений. Эти номера кадров распределены неравномерно, т.е. кадр 1 может иметь записи от строки 1 до 20 и кадр 2 от 21 до 25 и так далее. Я хочу прочитать эти данные с листа Excel, который имеет координаты x и y для каждого кадра, и построить эти координаты x и y на разбросанном графике, используя matplotlib. Вот мой код, номера кадров идентифицируются как индекс изображения.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
from matplotlib.pyplot import figure

df_xlsx = pd.read_excel('X10.xlsx')
temp = df_xlsx['Image index'][0]
i = 0; #number of the row

xList = []
yList = []
dt = df_xlsx.loc[df_xlsx['Image index'] == 19]
xList = np.array(dt['X position'])
yList = np.array(dt['Y position'])
rList = np.array(dt['Diameter'])

figure(figsize=(10.24,7.68), dpi=100)
fig, ax = plt.subplots()
plt.xlim([0,1024])
plt.ylim([0,768])
plt.scatter(xList, yList, color ='r')
plt.axis('off')
plt.gcf().set_size_inches((10.24,7.68))

for i in range(len(xList)):
    circle1 = plt.Circle((xList[i], yList[i]), rList[i], color='r')
    ax.add_artist(circle1)
plt.tight_layout(pad=0)
plt.savefig('f=19.png',dpi=100)    
plt.show()

Пример листа Excel

Проблема в том, что каждый раз, когда мне нужно ввести индекс изображения, а затем сохранить график. Можно ли это сделать в цикле, чтобы график постоянно генерировался в виде разных графиков для каждого номера кадра (индексные кадры)? Это сэкономит мне много времени, так как у меня много рамок и листов Excel. Я новичок в Python.

Источник
Karina
9 августа 2021 в 07:22
0

Добро пожаловать в СО. некоторые замечания к вашему коду: df_xlsx = pd.read_excel('X10.xlsx') не будет работать, если вы не работаете с очень старой версией pandas. Лучше обновите свои панды до более новой версии. Под лист excel вы имеете в виду файл или фактический лист (лист1, лист2,...)?

Ответы (1)

avatar
kwinkunks
9 августа 2021 в 13:07
0

Вы можете использовать groupby для обхода индекса изображения:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel('X10.xlsx')

for idx, group in df.groupby('Image index'):
    fig, ax = plt.subplots(figsize=(10.24, 7.68), dpi=100)
    diameter = 1 * group['Diameter']**2
    ax.scatter(group['X position'], group['Y position'], s=diameter)
    ax.set_xlim(0, 1024)
    ax.set_ylim(0, 768)
    ax.axis('off')
    plt.tight_layout(pad=0)
    plt.savefig(f'Image_index_{idx}.png', dpi=100)    

Некоторые заметки о других сделанных мною изменениях:

  • Вам не нужно преобразовывать столбцы DataFrame в массивы или списки.
  • Вы можете передать параметр размера s в plt.scatter(), чтобы сделать круги; вам просто нужно масштабировать числа, чтобы они соответствовали вашему масштабу. Например. вы можете умножить на некоторый коэффициент, отличный от 1. Обратите внимание, что в matplotlib вы указываете площадь маркера, а не диаметр.
VAISHAKH THOLAN
9 августа 2021 в 13:40
0

Большое спасибо за помощь kwinkunks, а также за заметки.

kwinkunks
9 августа 2021 в 14:20
0

@VAISHAKHTHOLAN Не беспокойтесь, если это поможет вам, не забудьте проголосовать / выбрать в качестве ответа.