Преобразование массивов для работы с гистограммой
Я столкнулся с небольшой проблемой при построении гистограммы в mathplot. У меня есть файл, в котором данные в одну строку разделённые через запятую. Я хочу прочесть данные и построить гистограмму но так, чтобы каждый столб был своего цвета. Но когда я читаю файл - у меня получается один массив формата [a,b,c...] Histogram же для построения, чтобы у каждого столбца был свой цвет, просто на вход [[a],[b],[c],...] Поэтому я попытался просто создать ещё один массив уже в требуемом виде код
import matplotlib.pyplot as plt
import numpy as np
from numpy import *
# data = loadtxt('Music.dat') Я читаю файл, после чтения получаю результат как в следующей строке
data = [105, 200, 310, 99, 286]
fig, axes = plt.subplots(nrows=2, ncols=2)
ax0, ax1, ax2, ax3 = axes.flatten()
labels = 'Grunge', 'Hip Hop', 'Metal', 'Schlager music', 'Rock'
bins = np.linspace(50, 400, 20)
colors = ['red', 'black', 'orange', 'green', 'tan']
ax1.hist([[105], [200], [310], [99], [286]], bins, density=True, histtype='bar', color=colors,
label=labels)
ax1.legend(prop={'size': 2})
ax1.set_title('Histogram with legend')
В этом случае (вручную введённые откорректированные данные) у меня получается ровно то, что я хочу - 5 столбцов разного цвета.
Я попытался преобразовать массив следующим образом
data_mod=np.zeros(shape=(5,1))
for x in range (0, 5):
data_mod[x]=[data[x]]
Но при выведении массива на экран print(data_mod) я получаю следующий результат:
[[105.]
[200.]
[310.]
[ 99.]
[286.]]
[105. 200. 310. 99. 286.]
т.е. как я понимаю, массив автоматически преобразуется.
В связи с этим мой вопрос: как мне максимально безболезненно преобразовать [105, 200, 310, 99, 286] в [[105] [200] [310] [ 99] [286]] и почему не работает мой метод? Возможно есть другой метод, заставить гистограмм покрасить каждый столбец в свой цвет, без столь неудобного преобразования?
Ответы (2 шт):
Для создания массива массивов в которые входит по одному числу подойдёт list comprehension. Для этого достаточно data = [[x] for x in data], где data - одномерный массив с данными
Если суть вопроса сводится к тому как преобразовать Numpy вектор в 2D матрицу, состоящую из одного столбца, то делается это обычно так:
arr = np.array(data) # данная строка нужна если данные не являются Numpy вектором
arr = arr.reshape(-1, 1)
In [4]: arr
Out[4]:
array([[105],
[200],
[310],
[ 99],
[286]])
In [5]: arr.shape
Out[5]: (5, 1)
Но для подобных задач, я бы использовал модуль Pandas - он идеально подходит для чтения/записи, обработки и визуализации табличных данных. Под капотом он использует тот же Numpy, но гораздо богаче его по функционалу.
PS если бы в вопросе был приведен пример более правдоподобных данных, то и в ответе я бы привел полностью рабочий пример от чтения данных до построения гистограмм.