несогласованный сюжет между matplotlib и seaborn в Python

я пытаюсь добавить полосы ошибок, используя plt.errorbar в pointplot в Seaborn:

import matplotlib
import matplotlib.pylab as plt
import seaborn as sns
import pandas
sns.set_style("white")

data = pandas.DataFrame({"x": [0.158, 0.209, 0.31, 0.4, 0.519],
                        "y": [0.13, 0.109, 0.129, 0.250, 1.10],
                        "s": [0.01]*5})

plt.figure()
sns.pointplot(x="x", y="y", data=data)
plt.errorbar(data["x"], data["y"], yerr=data["s"])
plt.show()

однако два графика выглядят совершенно по-разному, несмотря на то, что наносятся одни и те же данные. чем это объясняется и как можно добавить погрешности в точечный график?


person lgd    schedule 24.11.2015    source источник
comment
Вы уверены, что seaborn так и должно работать? Похоже, что matplotlib и seaborn соревнуются за одно окно вывода и, вероятно, путают настройки друг друга. Если вы строите графики отдельно, они кажутся правильными.   -  person fjarri    schedule 24.11.2015
comment
Можете ли вы добавить изображение, показывающее различия?   -  person tmdavison    schedule 24.11.2015


Ответы (1)


Кажется, что sns.pointplot просто использует массив [0...n-1] в качестве значений x, а затем использует значения x, которые вы предоставляете, для обозначения делений на оси x. Вы можете проверить это, взглянув на ax.get_xlim(), который выводит [-0.5, 4.5]. Поэтому, когда вы предоставляете фактические значения x для plt.plot, они просто кажутся неправильными.

Я бы не сказал, что это ошибка, так как Seaborn считает ввод в pointplot категориальным (вот документация для получения дополнительной информации)

Вы можете решить это для своего простого примера, имитируя поведение seaborns:

import matplotlib
import matplotlib.pylab as plt
import seaborn as sns
import pandas
import numpy as np
sns.set_style("white")

data = pandas.DataFrame({"x": [0.158, 0.209, 0.31, 0.4, 0.519],
                        "y": [0.13, 0.109, 0.129, 0.250, 1.10],
                        "s": [0.05]*5})

plt.figure()
sns.pointplot(x="x", y="y", data=data)
plt.errorbar(np.arange(5), data["y"], yerr=data["s"], color='r')
plt.show()

введите здесь описание изображения

person hitzg    schedule 24.11.2015