Как создать частично сложенный столбчатый график

#python #pandas #matplotlib

#python #панды #matplotlib

Вопрос:

Я хочу создать частично сложенный столбчатый график из n элементов, где n — 1 элементы сложены, а оставшийся элемент — это еще один столбик, примыкающий к сложенным столбцам одинаковой ширины. Соседний элемент столбца отображается на вторичной оси y и обычно представляет собой процент, отображаемый между 0 и 1.

Решение, которое я использую в настоящее время, может хорошо представлять данные, но мне любопытно узнать, как я мог бы добиться желаемого результата в виде одной полосы равной ширины рядом с полосой со стеком.

 import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.patches as mpatches

mylabels=list('BCD')

df = pd.DataFrame(np.random.randint(1,11,size=(5,4)), columns=list('ABCD'))
df['A'] = list('abcde')
df['D'] = np.random.rand(5,1)

ax = df.loc[:,~df.columns.isin(['D'])].plot(kind='bar', stacked=True, x='A', figsize=(15,7))
ax2 = ax.twinx()
ax2.bar(df.A,df.D, color='g', width=.1)
ax2.set_ylim(0,1)
handles, labels = ax.get_legend_handles_labels()
green_patch = mpatches.Patch(color='g')
handles.append(green_patch)
ax.legend(handles=handles, labels=mylabels)
ax.set_xlabel('')
  

Пример

Ответ №1:

Давайте попробуем передать align='edge' и width контролировать относительное положение столбцов:

 ax = df.drop('D', axis=1).plot.bar(x='A', stacked=True, align='edge', width=-0.4)
ax1=ax.twinx()


df.plot.bar(x='A',y='D', width=0.4, align='edge', ax=ax1, color='C2')

# manually set the limit so the left most bar isn't cropped
ax.set_xlim(-0.5)


# handle the legends
handles, labels = ax.get_legend_handles_labels()
h, l = ax1.get_legend_handles_labels()
ax.legend(handles=handles   h, labels=mylabels l)
ax1.legend().remove()
  

Вывод:

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

Комментарии:

1. Аккуратно! Я собирался использовать параметр position и передать position=1 и position = 0.

2. @ScottBoston да, position тоже аккуратно.

3. Будет ли позиция работать для более чем одного соседнего столбца? (т. е. один сложенный и два смежных)

4. То же самое с edge, это вряд ли сработает. Вам нужно вручную сдвигать столбцы, когда у вас более двух столбцов за один тик.

5. Я вижу, что ручное смещение столбцов приведет к установке для них новых значений x, скорректированных так, чтобы они были на одном уровне с соседними столбцами? спасибо @QuangHoang