matplotlib ValueError:尝试使用Pandas图在区域堆积图中绘制分组的x轴上的2列时,x必须是标签或位置

kxeu7u2r  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(112)

我有一组数据,有3列标签,年和总数。我的总数是基于标签和年的组。

+--------------------+-------+-------+
|               Label|   Year|  Total|
+--------------------+-------+-------+
|                 FTP|02/2018| 193360|
|              BBBB  |01/1970|     14|
|              BBBB  |02/2018|4567511|
|                SSSS|02/2018| 187589|
|                Dddd|02/2018|  41508|

我想绘制的数据,就像下面的图像。

如何实现这一点与堆积面积图在Pandaspython。(我的x轴应该有我的标签和年份值,并根据该分组的y轴应该绘图值)
我试过的代码与seaborn一样正常

dF.plot(figsize=(20,8), x =['Label','Year'], y ='Total', kind = 'area', stacked = True)

ax = df.plot(x="label", y="Total", legend=False, figsize=(10,8))
ax2 = ax.twinx()
df.plot(x="label", y="Dst_Port", ax=ax2, legend=False, color="r", figsize=(10,8))
ax.figure.legend()
plt.show()

我目前的图表可以使用单一x轴栏值绘制。

sczxawaw

sczxawaw1#

借助this post绘制类别网格线:

  • 用“标签”、“年份”对数据进行分组,然后对“总计”求和。
  • 出图方式如下
import matplotlib.pyplot as plt

df = pd.DataFrame(data=[["FTP","02/2018",1000],["BBBB","02/2018",1500],["SSSS","02/2018",1400],["Dddd","02/2018",3000],["FTP","02/2017",1800],["BBBB","02/2017",1700],["SSSS","02/2017",1600],["Dddd","02/2017",1500]], columns=["Label","Year","Total"])

df = df.groupby(["Label", "Year"]) \
       .agg(Total=("Total","sum")) 

def add_line(ax, xpos, ypos):
    line = plt.Line2D([xpos, xpos], [ypos + .1, ypos],
                      transform=ax.transAxes, color='gray')
    line.set_clip_on(False)
    ax.add_line(line)

def label_len(my_index,level):
    labels = my_index.get_level_values(level)
    return [(k, sum(1 for i in g)) for k,g in itertools.groupby(labels)]

def label_group_bar_table(ax, df):
    ypos = -.1
    scale = 1./df.index.size
    for level in range(df.index.nlevels)[::-1]:
        pos = 0
        for label, rpos in label_len(df.index,level):
            lxpos = (pos + .5 * rpos)*scale
            ax.text(lxpos, ypos, label, ha='center', transform=ax.transAxes)
            add_line(ax, pos*scale, ypos)
            pos += rpos
        add_line(ax, pos*scale , ypos)
        ypos -= .1

ax = df.plot.area(figsize=(20,5))
ax.set_xticklabels("")
ax.set_xlabel("")
label_group_bar_table(ax, df)

相关问题