【问题标题】:How to plot all dataframes from a dictionary of dataframes如何从数据框字典中绘制所有数据框
【发布时间】:2020-10-22 00:07:53
【问题描述】:

我有很多数据,所以为了简化:

data = [[0.5, 1,'abcnews'],
        [0.4, 1.2, 'abcnews'],
        [0.8, 1.7, 'cnn'], 
        [0.9, 1.4, 'abcnews'],
        [0.4, 1.3, 'abcnews'], 
        [0.75, 1.67, 'cnn']]
a = pd.DataFrame(data,columns=['cpc','rate_bid', 'site_target'],dtype=float)  

data = [[0.7, 1, 'cnn'],
        [0.4, 1.2, 'abcnews'],
        [0.1, 1.4, 'cnn'],
        [0.9, 1.6, 'cnn']]
b = pd.DataFrame(data,columns=['cpc','rate_bid', 'site_target'],dtype=float)

data = [[0.4, 1.1, 'abcnews'],
        [0.5, 1, 'abcnews'],
        [0.6, 1.4, 'abcnews'],
        [0.7, 1.8, 'abcnews'],
        [0.8, 1.2, 'cnn']]
ac = pd.DataFrame(data,columns=['cpc','rate_bid', 'site_target'],dtype=float)


假设我们有一个名为 : d 的字典

在这个字典中,我有 31 个数据帧(a、b、c、...、ac)

所以在我的字典中我有类似的东西:

key           Type                  Size                  Value 

a           DataFrame               (6,3)             Column names : cpc, rate_bid, site_target
b           DataFrame               (4.3)             Column names : cpc, rate_bid, site_target
.
.
.
ac          DataFrame               (5.3)             Column names : cpc, rate_bid, site_target
  • 我想要 31 个图表(我的 dict 的每个数据框)
  • 有了这种情节:sns.lineplot(data=a, x='cpc, y='rate_bid', hue='site_target', legend = False)
  • 我该怎么做?

【问题讨论】:

    标签: python pandas matplotlib plot seaborn


    【解决方案1】:
    • 鉴于样本数据,.scatterplot 是更好的选择。
      • 费率出价是每次点击费用 (CPC) 的函数
        • 每一个都是离散指标
      • 如果您愿意,可以替换为 .lineplot
    • 您需要hue='site_target',但是由于正在迭代数据帧,因此无法保证每个绘图的颜色映射相同。
      • 需要根据所有数据帧的唯一 'site_target' 值创建自定义颜色映射
      • 由于颜色相同,请将一个图例放在图的一侧,而不是在每个图中都放置一个图例
    import pandas as pd
    import matplotlib.pyplot as plt
    from matplotlib.patches import Patch
    import seaborn as sns
    import math
    
    # given d as the dict of dataframes
    
    # create color mapping based on all unique values of site_target
    unique_site = {site for v in d.values() for site in v.site_target.unique()}  # get unique sites
    colors = sns.color_palette('husl', n_colors=len(unique_site))  # get a number of colors
    cmap = dict(zip(unique_site, colors))  # zip values to colors
    
    # iterate through dictionary and plot
    col_nums = 3  # how many plots per row
    row_nums = math.ceil(len(d) / col_nums)  # how many rows of plots
    plt.figure(figsize=(10, 4))  # change the figure size as needed
    for i, (k, v) in enumerate(d.items(), 1):
        plt.subplot(row_nums, col_nums, i)
        p = sns.scatterplot(data=v, x='cpc', y='rate_bid', hue='site_target', palette=cmap)
        p.legend_.remove()
        plt.title(f'DataFrame: {k}')
    
    plt.tight_layout()
    # create legend from cmap
    patches = [Patch(color=v, label=k) for k, v in cmap.items()]
    # place legend outside of plot
    plt.legend(handles=patches, bbox_to_anchor=(1.04, 0.5), loc='center left', borderaxespad=0)
    plt.show()
    

    用.lineplot 代替.scatterplot

    【讨论】:

      猜你喜欢
      • 2019-05-27
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      相关资源
      最近更新 更多