Невозможно изменить ширину при добавлении комментариев - PullRequest
0 голосов
/ 19 февраля 2019

Я создаю горизонтальную столбчатую диаграмму с тремя сегментами, используя следующий код:

import matplotlib.pyplot as plt
import numpy as np

def create_stacked_hbar(data):

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

    ylabels = list(data.keys())
    labels = ['a', 'b', 'c', 'd', 'e', 'f']

    c = []
    v = []           
    for key, val in data.items():
        c.append(key)
        v.append(val)
    v = np.array(v)
    print(v)

    plt.barh(range(len(c)), v[:,0], width=1, color='red', 
             edgecolor='w',linewidth=2, tick_label=ylabels, label=labels[0])
    plt.barh(range(len(c)), v[:,1], width=1, left=v[:,0], color='orange', 
             edgecolor='w', linewidth=2, label=labels[1])
    plt.barh(range(len(c)), v[:,2], width=1, left=(v[:,0]+v[:,1]), color='yellow', 
             edgecolor='w', linewidth=2, label=labels[2])

    for p in ax.patches:
            left, bottom, width, height = p.get_bbox().bounds
            if width != 0.0:
                ax.annotate(str(int(width)), xy=(left+width/2, bottom+height/2), 
                            ha='center', va='center', size = 12)

    plt.legend(bbox_to_anchor=(0, -0.15), loc=3, prop={'size': 14}, frameon=False)
    plt.yticks(np.arange(len(ylabels)), ylabels)
    plt.show()

data = {'A': [8, 7, 2], 'B': [0, 2, 0], 
                 'C': [3, 2, 4], 'D': [0, 4, 0], 
                 'E': [0, 1, 1], 'F': [0, 1, 0], 
                 'G': [0, 0, 0]}

create_stacked_hbar(data)

Проблема в том, что при попытке установить width = 1 в столбцах выдается ошибка типа:

TypeError: <lambda>() got multiple values for argument 'width'

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

Также обратите внимание, что я не могу использовать метод "dataframe.plot.barh(data, stacked=True)" через панд для генерации этого графика.

1 Ответ

0 голосов
/ 19 февраля 2019

Вы строите горизонтальную гистограмму, параметр width соответствует данным, поэтому в вашем примере вы передаете v[:,0] и 1 как width.Если вы пытаетесь указать высоту, потому что вы не хотите пробелов между столбцами, которые нужно установить height=1, рассмотрите этот пример:

import numpy as np
import matplotlib.pyplot as plt

# Seeded for reproducing
np.random.seed(1)
v1 = abs(np.random.randn(10))
v2 = abs(np.random.randn(10))
v3 = abs(np.random.randn(10))
c = range(10)

plt.title("Sample bar plot")
plt.barh(c, v1, height=1, alpha=0.8, color='r')
plt.barh(c, v2, height=1, left=v1, alpha=0.8, color='b')
plt.barh(c, v3, height=1, left=v1+v2, alpha=0.8, color='g')
plt.show()

Это даст вам

image

Где удаление спецификации height=1 даст вам

image

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