Использование отсортированного файла для построения оси X с соответствующими значениями Y из исходного файла - PullRequest
0 голосов
/ 21 июня 2019

Пример данных на GitHub

У меня есть CSV-файл, который имеет 2 столбца.Первый столбец имеет формат: name001.a.a, а второй столбец - четырехзначное число (например: 0001).

У меня есть другой файл, который отсортировал первый столбец файла выше.

Цель индексации первого столбца заключается в том, что 1) у меня есть много этих файлов, которые я буду строить на одном графике в будущем 2) мне нужно, чтобы они были отсортированы.

Фактический файл ( us_csv_file ), содержащий оба столбца, имеет следующий формат:

name002.a.a,0002
name001.a.a,0001
name005.a.a,0025

Сортированный файл CSV ( hostnum.csv *)1019 *) - Я использую сортировку первого столбца следующим образом (разделитель - это TAB):

"1    name001.a.a"
"2    name002.a.a"
"3    name005.a.a"

Я пытался найти любые другие идеи, чтобы обойти это или решить, но могне найти его.Кто-нибудь может помочь мне с кодом, пожалуйста?

Мой вопрос:

Как я могу использовать отсортированный файл для построения оси X с меткой строк (без номеров индексов), нопоказать соответствующие 4-значные номера из 1-го файла для значений Y?

Пример графика, который я создал с помощью Excel, будет выглядеть так: График, созданный как модель

------------------------------------------------------------ РЕДАКТИРОВАТЬ 1 ------------------------------------------------------------

* ОБНОВЛЕНО: ГРАФ IПОЛУЧИТЕ ПОСЛЕ КОДА НИЖЕ * После нового кода -GRAPH

from matplotlib import pyplot as plt
from matplotlib import ticker as ticker
from textwrap import wrap
import numpy as np
import csv

csv_file = []
with open('hostnum.csv', 'r') as host:
    for line in host.readlines():
        line = line.replace('"', '')
        line = line.strip('\n')
        rank, value = line.split("  ")
        csv_file.append(value)

us_csv_file = []
with open('firsFile.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file.append(line)

us_csv_file1 = []
with open('secondFile.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file1.append(line)

us_csv_file2 = []
with open('thirdFile.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file2.append(line)        

us_csv_file.sort(key=lambda x: csv_file.index(x[0]))
us_csv_file1.sort(key=lambda x: csv_file.index(x[0]))
us_csv_file2.sort(key=lambda x: csv_file.index(x[0]))


plt.title("\n".join(wrap("ery very very very long long long title title title that that that wrapped wrapped wrapped")))
plt.xlabel("Node Names", fontsize = 8)
plt.ylabel("Run Times", fontsize = 8)



plt.plot([int(item[1]) for item in us_csv_file], 'o-')
plt.plot([int(item[1]) for item in us_csv_file1], 'o-')
plt.plot([int(item[1]) for item in us_csv_file2], 'o-')

#plt.xticks(np.arange(len(csv_file)), [item for item in csv_file])
plt.xticks(np.arange(len(csv_file))[::100], csv_file[::100])
plt.savefig('./test.png') #saves a picture of the graph to the file

plt.show()

------------------------------------------------------------ РЕДАКТИРОВАТЬ 2 ------------------------------------------------------------

Изменен сюжет для разброса.Но значения не соответствуют оси X.Добавлен пример изображения, но вместо чисел на оси x должны быть имена узлов, как и в моем примере изображения выше. Обновленные строки:

plt.scatter(range(len(us_csv_file)), [int(item[1]) for item in us_csv_file], c='r')

#plt.xticks(np.arange(len(csv_file)), [item for item in csv_file])
plt.xticks(np.arange(len(csv_file))[::1], csv_file[::1])
plt.savefig('./test.png')

Что я пытаюсьполучить с именами хостов в виде оси X Scatter Graph Sample

------------------------------------------------------------ РЕДАКТИРОВАТЬ3 ------------------------------------------------------------

Изменен код в конце, чтобы очистить ось X, но он все еще не работает.Кроме того, на графике есть 3 файла, которые у меня есть, и добавлены разные символы для каждого.

Обновленный код

from matplotlib import pyplot as plt
import numpy as np
from textwrap import wrap
import csv

csv_file = []
with open('hostnum.csv', 'r') as host:
    for line in host.readlines():
        line = line.replace('"', '')
        line = line.strip('\n')
        rank, value = line.split("  ")
        csv_file.append(value)

us_csv_file = []
with open('firsFile.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file.append(line)

us_csv_file1 = []
with open('secondFile.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file1.append(line)

us_csv_file2 = []
with open('thirdFile.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file2.append(line)


us_csv_file.sort(key=lambda x: csv_file.index(x[0]))
us_csv_file1.sort(key=lambda x: csv_file.index(x[0]))
us_csv_file2.sort(key=lambda x: csv_file.index(x[0]))


plt.scatter(range(len(us_csv_file)), [int(item[1]) for item in us_csv_file], c='r', marker='+', label="First")
plt.scatter(range(len(us_csv_file1)), [int(item[1]) for item in us_csv_file1], c='b', marker=(5,2), label="Second")
plt.scatter(range(len(us_csv_file2)), [int(item[1]) for item in us_csv_file2], c='g', marker=(5,1), label="Third")

plt.legend(loc='upper right') #where to indicate the labels of the signs
plt.grid(True) #Created grid for x-y axises

plt.title("\n".join(wrap("long long long long long long tittle ttitle ttitle that that fixed fixed ")))
plt.xlabel("Node Names", fontsize = 8)
plt.ylabel("Run Times", fontsize = 8)

#plt.xticks(np.arange(0,len(csv_file),1000)[::2], csv_file[::2])
plt.xticks(np.arange(len(csv_file))[::2], csv_file[::2])
plt.yticks(np.arange(0,11000,1000))

plt.show()

График с метками оси X неясен (как это показывает Gridlines какхорошо) Graph with X-axis labels unclear with Gridlines

* ФИНАЛЬНЫЙ ГРАФ * Final Graph

Ответы [ 2 ]

1 голос
/ 21 июня 2019

ПРИМЕЧАНИЕ. Сортировка, вероятно, не самый эффективный метод, но начинать нужно с

. Загрузите файл CSV с помощью csv.reader() и выполните итерации всписок

Загрузите отсортированный файл XML и в другой список (Примечание: вы, вероятно, можете снова использовать csv.reader() и установить разделитель на tab, чтобы упростить его)

Синтаксис для загрузки файла CSV выглядит следующим образом:

import csv
csv_file = []
with open('file.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        csv_file.append(line)

См. csv.reader() документы для получения дополнительной информации и использования разделителей.На всякий случай, не забывайте менять имя переменной файла и программы чтения при открытии различных файлов.

Однако для вашего hostnum.csv csv не будет работать, поэтому вы можете написать парсер с помощьюрука.Я сделал это для вас:

csv_file = []
with open('/Users/dash/Documents/hostnum.csv', 'r') as host:
    for line in host.readlines():
        line = line.replace('"', '')
        line = line.strip('\n')
        rank, value = line.split("    ")
        csv_file.append(value)

Сортировка списка по позиции каждого элемента в списке XML:

us_csv_file.sort(key=lambda x: csv_file.index(x[0]))

Это работает с использованием лямбда(анонимная функция), чтобы взять строку в CSV-файле и найти ее номер строки в отсортированном XML-файле.Лямбда возвращает число, которое затем сортирует, чтобы установить новую позицию элемента в списке.

См. Python Wiki для основного учебника по сортировке.

Для построения графика используйте matplotlib.pyplot и установите метки с помощью matplotlib.pyplot.xticks()

Пример:

from matplotlib import pyplot as plt
import numpy as np

plt.plot([int(item[1]) for item in us_csv_file], 'o-')
plt.xticks(np.arange(len(csv_file)), [item for item in csv_file])

plt.show()

The end result

Надеюсь, это поможет!

EDIT: используйте csv_file в lambda

EDIT2: Вот полный код:

from matplotlib import pyplot as plt
import numpy as np
import csv

csv_file = []
with open('hostnum.csv', 'r') as host:
    for line in host.readlines():
        line = line.replace('"', '')
        line = line.strip('\n')
        rank, value = line.split("    ")
        csv_file.append(value)

us_csv_file = []
with open('us_csv_file.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file.append(line)

us_csv_file.sort(key=lambda x: csv_file.index(x[0]))

plt.plot([int(item[1]) for item in us_csv_file], 'o-')
plt.xticks(np.arange(len(csv_file)), [item for item in csv_file])

plt.show()


РЕДАКТИРОВАТЬ (снова) Подумав об этом, я думаю, что лучшим способом было бы создать dict для каждого узла со всеми значениями, хранящимися в нем.

from matplotlib import pyplot as plt
import numpy as np
from textwrap import wrap
import csv

#Opens the sorted hostnum.csv file and reads it; replaces the quotation marks.
csv_file = []
with open('hostnum.csv', 'r') as host:
    for line in host.readlines():
        line = line.replace('"', '')
        line = line.strip('\n')
        rank, value = line.split("  ")
        csv_file.append(value)

#Opens the file and reads it
us_csv_file = []
with open('fileFirst.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file.append(line)

us_csv_file1 = []
with open('fileSecond.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file1.append(line)

us_csv_file2 = []
with open('fileThird.csv', 'r') as f:
    csvreader = csv.reader(f)
    for line in csvreader:
        us_csv_file2.append(line)


runs = []

file_0 = {}
file_1 = {}
file_2 = {}

for result in us_csv_file:
    node_name = result[0]
    node_value = result[1]

    if file_0.get(node_name):   # If the node exists in the list
        file_0[node_name].append(node_value)
    else:
        file_0[node_name] = [node_value]

runs.append(file_0)

for result in us_csv_file1:
    node_name = result[0]
    node_value = result[1]

    if file_1.get(node_name):   # If the node exists in the list
        file_1[node_name].append(node_value)
    else:
        file_1[node_name] = [node_value]

runs.append(file_1)

for result in us_csv_file2:
    node_name = result[0]
    node_value = result[1]

    if file_2.get(node_name):   # If the node exists in the list
        file_2[node_name].append(node_value)
    else:
        file_2[node_name] = [node_value]

runs.append(file_2)


# all_plots = [[[], []],[[], []],[[], []]]

all_plots = [] # Make an array of 3 arrays, each with a pair of arrays inside
# Each pair holds the x and y coordinates of the datapoints

for x in range(3):
    all_plots.append([[],[]])


for run_number, run_group in enumerate(runs):

    for key, values in run_group.items():
        sorted_position = csv_file.index(key)
        for item in values:
            all_plots[run_number][0].append(sorted_position)
            all_plots[run_number][1].append(int(item))

#indicates the label names at the given spot
plt.legend(loc='upper right')

#Creates grid for x-y axises
plt.grid(True)

#Creates wrapped title for the graph
plt.title("\n".join(wrap("longlonglonglonglonglonglonglonglonglonglonglonglonglongTITLETITLETITLETITLETITLETITLE")),size = 9.5)

#x-y labels for the graph
plt.xlabel("Node Names", fontsize = 8)
plt.ylabel("Run Times", fontsize = 8)

#ticks - x and y axisses' data format.

plt.scatter(all_plots[0][0], all_plots[0][1], c='b', marker='+', label="First")
plt.scatter(all_plots[1][0], all_plots[1][1], c='g', marker=(5,2), label="Second")
plt.scatter(all_plots[2][0], all_plots[2][1], c='r', marker=(5,1), label="Third")


plt.xticks(range(len(csv_file))[::25], [item for item in csv_file][::25], rotation=90, size=8)


plt.yticks(np.arange(0,11000,1000), size=8)

#Saves a PNG file of the current graph to the folder and updates it every time
plt.savefig('./test.png', bbox_inches='tight')

# Not to cut-off bottom labels(manually) - enlarges bottom
plt.gcf().subplots_adjust(bottom=0.23)


plt.show()
0 голосов
/ 10 июля 2019

Проект был задокументирован на странице GITHUB: https://rusife.github.io/Python-Project/

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