Python matplotlib 3D гистограмма с ошибками - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь получить 3D-график с ошибками.Я открыт для использования matplotlib, seaborn или любой другой библиотеки или инструмента python

Поиск в SO Я обнаружил, что трехмерные гистограммы можно сделать, нарисовав несколько 2D графиков ( здесь, например, ).Это мой код:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D


dades01 = [54,43,24,104,32,63,57,14,32,12]
dades02 = [35,23,14,54,24,33,43,55,23,11]
dades03 = [12,65,24,32,13,54,23,32,12,43]

df_3d = pd.DataFrame([dades01, dades02, dades03]).transpose()
colors = ['r','b','g','y','b','p']


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
z= list(df_3d)
for n, i in enumerate(df_3d):
    print 'n',n
    xs = np.arange(len(df_3d[i]))
    ys = [i for i in df_3d[i]]
    zs = z[n]

    cs = colors[n]
    print ' xs:', xs,'ys:', ys, 'zs',zs, ' cs: ',cs
    ax.bar(xs, ys, zs, zdir='y', color=cs, alpha=0.8)


ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

Я получаю трехмерный график 'ish'.

3D bar plot without error bars

Мой вопрос: Как добавить полосы ошибок?

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

yerr=[10,10,10,10,10,10,10,10,10,10]

Если я добавлю свои полосы ошибокна каждом «2D» графике:

ax.bar(xs, ys, zs, zdir='y', color=cs,yerr=[10,10,10,10,10,10,10,10,10,10], alpha=0.8)

Не работает:

AttributeError: 'LineCollection' object has no attribute 'do_3d_projection'

Я также попытался добавить:

#ax.errorbar(xs, ys, zs, yerr=[10,10,10,10,10,10,10,10,10,10], ls = 'none')

Но снова ошибка:

TypeError: errorbar() got multiple values for keyword argument 'yerr'

Есть идеи, как я могу получить 3D-графики с ошибками?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Насколько я знаю, не существует прямого способа сделать это в 3d. Однако вы можете создать обходное решение, как показано ниже. Решение вдохновлено здесь . Хитрость заключается в том, чтобы пройти две точки, лежащие вертикально, а затем использовать _ в качестве маркера, чтобы действовать в качестве заглушки для строки ошибок.

yerr=np.array([10,10,10,10,10,10,10,10,10,10])

for n, i in enumerate(df_3d):
    xs = np.arange(len(df_3d[i]))
    ys = [i for i in df_3d[i]]
    zs = z[n]
    cs = colors[n]
    ax.bar(xs, ys, zs, zdir='y', color=cs, alpha=0.8)
    for i, j in enumerate(ys):
        ax.plot([xs[i], xs[i]], [zs, zs], [j+yerr[i], j-yerr[i]], marker="_", color=cs)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

enter image description here

0 голосов
/ 18 января 2019

Прежде всего, не используйте 3D-график, когда 2D-график будет достаточным, что в этом случае будет. Использование 3D-графиков для 2D-данных излишне запутывает вещи.

Во-вторых, для получения желаемого результата вы можете использовать комбинацию фрейма данных MultiIndex Pandas:

df = pd.DataFrame({
    'a': list(range(5))*3,
    'b': [1, 2, 3]*5,
    'c': np.random.randint(low=0, high=10, size=15)
}).set_index(['a', 'b'])

fig, ax = plt.subplots(figsize=(10,6))

y_errs = np.random.random(size=(3, 5))
df.unstack().plot.bar(ax=ax, yerr=y_errs)

Создается сюжет, подобный следующему:

enter image description here

Я использую стиль 'bmh' здесь (то есть, я звонил plt.style.use('bmh') ранее в своей записной книжке, которую я открыл), поэтому он выглядит так, как он делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...