Наконец, я получил ответ. Когда я следовал примеру на странице matplotlib, он включает ключевое слово bottom, указывающее рост данных каждой выборки по сравнению с предыдущей.
p2 = plt.bar(ind, womenMeans, width, color='y', bottom=menMeans, yerr=womenStd)
Например, если мы хотим отобразить данные о мужчинах и женщинах, как в примере, мы начинаем с мужчин с оценкой 20 (в серии G1), затем, чтобы нарисовать женщин, они начинают отображать значение 25 с внизу значение 20. Чтобы расширить это, если мы добавили другую категорию, скажем, детей, с оценкой 15, то она должна быть построена с bottom = 20 + 25 = 45 и т. д.
Проблема с отрицательными значениями заключается в том, что они росли в направлении, противоположном положительным. поэтому он должен начинаться с основания = 0, затем с максимального значения суммы либо положительных, либо отрицательных значений независимо друг от друга. Чтобы понять это на примере, если мы хотим построить ряд следующим образом: (20, 25, -15, 30, -10, -5, 17, 3, -28) Основания каждого значения должны быть следующими (0, 20, 0, 45, -15, -25, 75, 92, -30) Почему?
Для 20 мы просто начинаем рисовать, поэтому дно не требуется. Для числа 25 нам нужно увеличить его на 20. Для числа -15 это первое отрицательное значение, поэтому оно должно быть нарисовано ниже оси без нижнего значения, поэтому нижнее значение = 0. Для числа 30 оно должно быть увеличено на 20 + 25 = 45 Для -10 оно должно начинаться ниже предыдущего отрицательного значения, равного -15. Для следующего -5 оно должно начинаться ниже -10 + -15 = -25 И так далее...
def bottoms_matrix(matrix):
positives = []
negatives = []
for i, row_mat in enumerate(matrix):
tmp_p = []
tmp_n = []
for j, cell in enumerate(row_mat):
if cell >0:
tmp_p.append(cell)
tmp_n.append(0.)
else:
tmp_p.append(0.)
tmp_n.append(cell)
positives.append(tmp_p)
negatives.append(tmp_n)
# get cumulative sums
positives = positives[:-1]
negatives = negatives[:-1]
positives.insert(0, [0.] * len (matrix[0]))
negatives.insert(0, [0.] * len(matrix[0]))
tmp = swap_matrix(positives)
tmp = [list(np.cumsum(t)) for t in tmp]
positives = swap_matrix(tmp)
tmp = swap_matrix(negatives)
tmp = [list(np.cumsum(t)) for t in tmp]
negatives = swap_matrix(tmp)
final_matrix =[]
for i, row_mat in enumerate(matrix):
tmp =[]
for j, cell in enumerate(row_mat):
tmp.append(positives[i][j] if cell > 0 else negatives[i][j])
final_matrix.append(tmp)
return final_matrix
Полный пример с данными и всеми вспомогательными функциями загружен на мою страницу Git< /а>сильный>.
person
Mohammad ElNesr
schedule
21.04.2016