【问题标题】:Stacked Area plot for Python DataframePython 数据框的堆积面积图
【发布时间】:2020-09-19 09:12:18
【问题描述】:

我有一个包含两列的数据框 (df):“基础类型”,它有 4 种基础类型(轴、桩、组合、展开),另一列“Vs30”具有不同的参数 Vs30 值。每行代表一座桥梁,具有一种基础类型和一个 Vs30 值。

首先,我在 df 中创建一个新列“binVs30”,将“Vs30”的每个元素转换为不同的 bin,其中有 5 种不同的范围([0-200]、[200-400]...[ 800-1000])。

df['binVs30'] = pd.cut(df.Vs30, bins=np.arange(0, 1100, 200))

然后,我创建了一个堆叠面积图,代码如下:

color_table = pd.crosstab(df['binVs30'], df['Foundation Type'], dropna=False)
ax = color_table.plot(kind='area', figsize=(8, 8), stacked=True, rot=0)
display(ax)
plt.xlabel('')
plt.ylabel('Frequency', fontsize=12)
plt.legend(title='Foundation Type', loc='upper right')
plt.title('Column Database', fontsize='20')
plt.show()

Resulting Picture

生成的图片显示了一些不应该存在的额外垃圾箱。因此,我不得不通过手动添加以下代码来修复 xticks:

locs, labels = plt.xticks()
    plt.xticks(locs, ['','0-200','','200-400','','400-600','','600-800','','800-1000'], fontsize=10, rotation=45)

xticks-fixed Picture

Python 创建那些不应该存在的额外垃圾箱是否有原因?这是 Python 的错误吗?因为如果我将其更改为堆积条形图,问题就消失了。有没有办法通过不手动添加bin代码来修复它?

另外两个问题是,如何为区域图添加边缘颜色?比如:

color_table.plot(kind='area', figsize=(8, 8), stacked=True, edgecolor='black', legend=None, rot=0)

命令 edgecolor='black' 在堆积面积图中不起作用。

而且,如果我想为“Vs30”创建 bin,例如 ([0-200],[200-400]...[>800])。有没有办法我可以做到这一点?由于我创建“binVs30”列的方式不允许我创建一个“>800”的 bin。

谢谢。

【问题讨论】:

    标签: python pandas stacked-area-chart


    【解决方案1】:

    这里有几个问题。首先是关于在您的pd.cut() 中包含一个开放式垃圾箱。您可以使用np.inf 捕获最后一个 bin 中的所有内容并为其分配自定义标签。其次,既然你已经在使用matplotlib,我建议直接使用它的堆叠图而不是通过pandas。然后您可以毫无问题地使用edgecolor 参数。

    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
    df = pd.DataFrame(data={
        "foundation" : np.random.choice(list("ABCD"), 1000),
        "binVs30"    : np.random.randint(0, 1200, 1000)
    })
    
    bins = [0, 200, 400, 600, 800, np.inf]
    labels = ["0-199", "200-399", "400-599", "600-799", "800+"]
    
    df["bins"] = pd.cut(
        df["binVs30"], bins=bins, labels=labels,
        right=False, include_lowest=True)
    
    stack_data = pd.crosstab(df['bins'], df['foundation'], dropna=False)
    
    stack_array = stack_data.values.T.tolist()
    
    pal = sns.color_palette("Set1")
    plt.figure(figsize=(8,4))
    
    plt.stackplot(
        labels, stack_array, labels=list("ABCD"),
        colors=pal, alpha=0.4, edgecolor="black")
    
    plt.legend(loc='upper left')
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多