Пример данных на 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
------------------------------------------------------------ РЕДАКТИРОВАТЬ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 какхорошо)
* ФИНАЛЬНЫЙ ГРАФ *