根据指定的排名顺序对子图(水平条)进行排序

Sort Subplots (horizontal bar) based on a specified Rank Order

我绘制了一个子图,其中包含需要按特定顺序显示的类别。我正在使用 PowerBI Python 脚本处理视觉效果,因此看起来我无法对数据框进行排序,因为 PowerBI 会自动进行排序。在我的数据集中,我有 fruit_category、rnk、quantity_sold、预测、目标和库存数量。数据集应按 rnk 排序,因为它指定了 fruit_category 的排序顺序。但是,我尝试做

dataset = dataset.sort_values('rnk',ascending=True)

但它不起作用。我的猜测是 PBI 不让我这样做。这是图表:

这是我的代码:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
height1 = 0.3
height2 = 0.8

qtysold = dataset.Quantity_Sold
forecast = dataset.Forecast
goals = dataset.Goal
stockqty = dataset.Stock_Quantity
fruitcat = dataset.fruit_category
sortorder = dataset.rnk
numfruitcat = len(fruitcat)

dataset = dataset.sort_values('rnk',ascending=True)

qgoals = [goals]
goal_names = ['']

fig,plts =  plt.subplots(numfruitcat,1,figsize=(15,7),dpi=500, sharex=True)  # size 15x7
fig.subplots_adjust(hspace=0.9)

for goalidx in range(0,numfruitcat):
    idx = len(fruitcat)-1 - goalidx  # reverse order because of how subplot numbers them
    plts[goalidx].barh(fruitcat[idx], goals*0.0025, color='k', height=5, left=goals[idx])
    plts[goalidx].barh(fruitcat[idx], forecast[idx], color=(0.627, 0.627, 0.627, 0.3), height=3)
    plts[goalidx].barh(fruitcat[idx], stockqty[idx], color=(0.682, 0.561, 0.624, 0.2), height=3)
    plts[goalidx].barh(fruitcat[idx], qtysold[idx], color=(0.851, 0, 0.455,1), height=2)    
    plts[goalidx].text(qtysold[idx],0,'{:,}'.format(qtysold[idx]))
    plts[goalidx].text(forecast[idx],0,'{:,}'.format(forecast[idx]))
    plts[goalidx].text(stockqty[idx],0,'{:,}'.format(stockqty[idx]))
    
    for count, qtr in enumerate(qgoals):
        plts[goalidx].text(qtr[idx],3.2,'{}\n{:,}'.format(goal_names[count], qtr[idx]),horizontalalignment='left',verticalalignment='top',fontsize=10)
        plts[goalidx].axis([0, max(stockqty)+100, -1, 1])

plt.legend()
sns.despine(right=True)   
sns.set_theme(style="white")
plt.show()

如何轻松地根据 rnk 对水果进行分类?奖金问题,我试图避免我的价值标签重叠。有没有办法避免让它们重叠?例如,Mango 的预测数字和目标数字非常接近,所以它们都是 overlapping.Thanks!!

您在分配值后对数据集进行排序,请在之前进行。

dataset = dataset.sort_values('rnk',ascending=True)

qtysold = dataset.Quantity_Sold
forecast = dataset.Forecast
goals = dataset.Goal
stockqty = dataset.Stock_Quantity
fruitcat = dataset.fruit_category
sortorder = dataset.rnk
numfruitcat = len(fruitcat)