Я новичок в python, и у меня есть курсовая работа по созданию тепловой карты из данных в файле csv. Вверху указаны показатели эффективности автомобилей, а внизу — названия автомобилей. Я также разделил заголовки строк и столбцов на массивы. Я не уверен, как я могу загрузить эти значения в тики осей.
Я использую код ax.set_xticks() и то же самое для y, но не знаю, что поместить в скобки. ax.get_xticks() также не работает. Я пробовал несколько вариантов вещей, и все они выдают ошибку, в основном имя среза; см. код ниже.
if __name__ == "__main__":
# Load the data.
fileObj = open("CARS.csv").readlines()
lines = [line.strip().split(",") for line in fileObj]
# Reads the data into a list,
# then slicing to extract a list of cars, kpis and scoring.
cars = [line[0] for line in lines[1:]] #array storing car names
kpis = lines[0][1:] #array storing kpis
scoring = np.array([line[1:-1] for line in lines[1:]], dtype=float)
fig=plt.figure(figsize=(6,3))
ax=fig.add_subplot(111)
ax.set_xlim([0,9])
ax.set_xticks(kpis[lines[0][1:]])
ax.set_yticks(cars)
ax.set_title('Sportscar KPI Data')
ax.set_xlabel('KPI's')
ax.set_ylabel('Sportscars')
im = ax.imshow(scores, interpolation='nearest', aspect='auto')
plt.show()
Я надеюсь, что названия спортивных автомобилей из фрагмента будут помещены в раздел галочек, и ошибка выводит список имен, которые не могут быть перенесены. То же самое для KPI.
Краткий ответ:
Используйте pandas и seaborn:
import pandas as pd
import seaborn as sns
df = pd.read_csv('CARS.csv', index_col=0)
sns.heatmap(df)
Длинный ответ:
Вы могу запускаете свой код, исправляя некоторые ошибки...
fileObj = open("CARS.csv").readlines()
lines = [line.strip().split(",") for line in fileObj]
cars = [line[0] for line in lines[1:]]
kpis = lines[0][1:]
scoring = np.array([line[1:-1] for line in lines[1:]], dtype=float)
fig=plt.figure(figsize=(6,3))
ax=fig.add_subplot(111)
ax.set_title('Sportscar KPI Data')
ax.set_xlabel("KPI")
ax.set_ylabel('Sports car')
ax.set_xticks(range(len(kpis)))
ax.set_xticklabels(kpis)
ax.set_yticks(range(len(cars)))
ax.set_yticklabels(cars)
im = ax.imshow(scoring, interpolation='nearest', aspect='auto')
plt.show()
Однако,
есть много вещей, которые не были бы сделаны так в python (помимо всех ошибок отступов и того факта, что вы пытаетесь построить scores
, хотя ваша переменная была введена как scoring
):
Прежде всего, если вы открываете файл, вы должны сделать это в первой строке, а затем начать к нему доступ:
fileObj = open("CARS.csv")
lines = [line.strip().split(",") for line in fileObj.readlines()]
Затем вы можете правильно закрыть файл после его чтения
fileObj.close()
потому что теперь fileObj
действительно является файловый объект, fileObj.readlines()
нет, это список строк.
В любом случае, было бы еще лучше использовать блок with
для этой задачи обработки файлов, который автоматически закроется для вас:
with(open('CARS.csv')) as fileObj:
lines = [line.strip().split(",") for line in fileObj.readlines()]
(Обратите внимание, что отступ здесь необходим для всего, что должно обрабатываться блоком with)
Но все же, даже если это уже лучше, никто не будет делать это пошагово таким образом, читая файл построчно, извлекая метки вручную и конвертируя подраздел в numpy массив.
Даже если вы по какой-либо причине не можете/не хотите использовать pandas и seaborn, как было предложено выше, у numpy есть несколько хорошо написанных импортеров, например, например. np.genfromtxt
.
Большое спасибо за это, я следовал вашей инструкции, и это работает отлично! Я скоро попробую подход Seaborn, это то, что я нашел в своем исследовании, но должен был предоставить решение, используя только код Python. Спасибо еще раз!
Ну, во-первых,
ax.set_xlabel('KPI's')
недопустимый питон. Может быть, вы хотели использоватьax.set_xlabel("KPI's")
илиax.set_xlabel('KPI´s')
?