Гистограмма переменной ширины с морским дном

Я пытаюсь создать гистограмму с ячейками по оси X переменной ширины в Seaborn. Подобно этой диаграмме: введите здесь описание изображения Все мои значения ширины x будут в сумме составлять 100%, но я не могу найти пример того, как достичь этой цели с помощью Seaborn. Любые идеи?


person D. Smith    schedule 16.10.2017    source источник
comment
Нет причин использовать для этой цели участок морского бара. Вместо этого используйте pyplot.bar.   -  person ImportanceOfBeingErnest    schedule 18.10.2017


Ответы (2)


Вероятно, здесь может быть несколько возможных ответов. В морской гистограмме для этой цели можно использовать комбинацию нескольких параметров: "width" (значения ширины столбцов), "left" (значения расположения по оси X, что является обязательным аргументом) и "align ".

Очень простой пример:

import seaborn as sns

data = [7, 3, 15]
widths = [1, 5, 3]
left = [0, 1, 6]
sns.plt.bar(left, data, width = widths, color=('orange','green','blue'), 
alpha = 0.6, align='edge', edgecolor = 'k', linewidth = 2)

Обратите внимание, что «слева» (расположение столбцов) должно соответствовать ширине, чтобы столбцы просто соприкасались, а не перекрывались.

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

person BossaNova    schedule 17.10.2017
comment
Используя sns.plt.bar, вы вызываете функцию matplotlibs plt.bar. Это не имеет ничего общего с мореплавателем. - person ImportanceOfBeingErnest; 18.10.2017

Если вы хотите использовать Seaborn для гистограммы, вам необходимо впоследствии изменить ширину прямоугольников полос (патчей) (это делается через объектно-ориентированный интерфейс matplotlib согласно этот ответ):

import seaborn as sns

iris = sns.load_dataset('iris')
ax = sns.barplot('species', 'sepal_width', data=iris)
widthbars = [0.3, 0.6, 1.2]
for bar, newwidth in zip(ax.patches, widthbars):
    x = bar.get_x()
    width = bar.get_width()
    centre = x + width/2.
    bar.set_x(centre - newwidth/2.)
    bar.set_width(newwidth)

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

Вы также можете создать аналогичную гистограмму напрямую в matplotlib:

import matplotlib.pyplot as plt

widths = [0.3, 0.6, 1.2]
for x_pos, (species_name, species_means) in enumerate(iris.groupby('species').mean().groupby('species')):
     plt.bar(x_pos, species_means['sepal_width'], widths[x_pos])

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

person joelostblom    schedule 18.10.2017