График с ошибками в Python - PullRequest
1 голос
/ 09 мая 2020

У меня есть список в форме [[(x1, y1), (x2, y2), (x3, y3)], [...], [...]]

[[(10.0, -1.0), (7.0, 0.05889647076017157), (13.0, 0.47096776983628086)], [(10.5, -1.0), (13.0, 0.07080679131269396), (7.5, 0.16547229577841294)], [(11.0, -1.0), (8.0, 0.27471205881135075), (13.5, 0.682988382311833)]]

Я хочу извлечь первый индекс в кортежах из списка.

Например, приведенный выше список будет -> [[(10.0), (7.0), (13.0)], [(10.5), (13.0), (7.5)], [(11.0), (8.0), (13.5)]] (Форма: [[(x1), (x2), (x3)], [(x4), (x5), (x6) ], [(x7), (x8), (x9)]]

, а затем превратиться в график с полосами ошибок. (Первое значение в кортежах будет основными, а два других значения будут ошибок)

Вот что я пытаюсь получить:

enter image description here

Как мне это сделать? Я не могу найти ни одного аналогичный пример в сети.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Список можно получить следующим образом:

vals = [[i[0] for i in tup] for tup in lst ]
vals

[[10.0, 7.0, 13.0], [10.5, 13.0, 7.5], [11.0, 8.0, 13.5]]

Чтобы построить график, проще иметь его в матрице np и отсортировать, потому что функция шкалы ошибок требует ввода длины, а не координата:

import numpy as np
import matplotlib.pyplot as plt

vals = np.sort(np.array(vals))
vals[:,[0,2]] = vals[:,[0,2]] - vals[:,1].reshape(-1,1)
vals

array([[-3. , 10. ,  3. ],
       [-3. , 10.5,  2.5],
       [-3. , 11. ,  2.5]])

fig, ax = plt.subplots(1, 1)
ax.errorbar(vals[:,1], vals[:,1], yerr=[-vals[:,0],vals[:,2]], fmt='o')
plt.show()

enter image description here

0 голосов
/ 09 мая 2020

Можете попробовать

import matplotlib.pyplot as plt

x = [[(10.0, -1.0), (7.0, 0.05889647076017157), (13.0, 0.47096776983628086)], [(10.5, -1.0), (13.0, 0.07080679131269396), (7.5, 0.16547229577841294)], [(11.0, -1.0), (8.0, 0.27471205881135075), (13.5, 0.682988382311833)]]

plt.boxplot([[j[0] for j in i] for i in x])
...