matplotlib 颜色条形图是否按条件值是否存在?

1cklez4t  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(143)

我有这个dataframe:

df = pd.DataFrame({
    'year': [2022,2022,2022,2022,2022,2023,2023],
    'source': ['youtube', 'youtube', 'facebook', 'facebook', 'facebook', 'google', 'google'], 
             'score': [10,20,100,200,300,90,70], 
             'rating': ['small', 'large', 'small', 'medium', 'large', 'medium', 'large']})

我试图为每个不同的源值创建一个堆叠条形图-因此将有3个图,源列中的每个值一个。
我试图通过df.plot中的颜色Map参数为条形图设置颜色-但不是所有的值都显示出来,例如youtube for 2022没有medium的值,因此颜色Map导致错误。
这是我的颜色Map:

color_map = {'small': 'yellow', 'medium': 'green', 'large':'blue'}

我怎样才能确保在绘制图时没有错误,并且它能很好地处理丢失的情况?
我的plot代码如下:

for company in df['source'].unique(): 
    # filter to make plot of company only
    temp_df = df[df.source == company]
    
    temp_df = temp_df.pivot_table(index=temp_df.year, columns=['source', 'rating'], values='score', aggfunc='sum')
    
    color_map = {'small': 'yellow', 'medium': 'green', 'large':'blue'}
    
    fig, ax = plt.subplots(1,1)
    
    ax = temp_df.plot.bar(stacked=True, figsize=(10, 6), ylabel='scores', xlabel='dates', title='Scores', ax = ax,color = color_map)
1cosmwyk

1cosmwyk1#

在透视DataFrame之后,用零填充任何缺失值。这确保了在原始DataFrame中不存在的年份、来源和评级的任何组合在透视DataFrame中将具有零值。正如您所指出的,某些来源可能没有所有评级。因此,我们将color_map子集化,以仅包括temp_df中存在的评级的颜色。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
    'year': [2022,2022,2022,2022,2022,2023,2023],
    'source': ['youtube', 'youtube', 'facebook', 'facebook', 'facebook', 'google', 'google'], 
    'score': [10,20,100,200,300,90,70], 
    'rating': ['small', 'large', 'small', 'medium', 'large', 'medium', 'large']
})

color_map = {'small': 'yellow', 'medium': 'green', 'large':'blue'}

for company in df['source'].unique(): 
    # filter to make plot of company only
    temp_df = df[df.source == company]
    
    # pivot the data
    temp_df = temp_df.pivot_table(index='year', columns='rating', values='score', aggfunc='sum').fillna(0)

    # Get the unique ratings present in the temp_df
    present_ratings = temp_df.columns

    # Subset the color_map using only the ratings present in temp_df
    subset_color_map = {rating: color_map[rating] for rating in present_ratings if rating in color_map}

    fig, ax = plt.subplots(1,1)
    ax = temp_df.plot.bar(stacked=True, figsize=(10, 6), ylabel='scores', xlabel='dates', title=f'Scores of {company}', ax=ax, color=[subset_color_map[r] for r in present_ratings])
    plt.legend(title='Rating')
    plt.show()

相关问题