#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