【问题标题】:How to show chart type of each Y-axis to distinguish compared factors如何显示每个 Y 轴的图表类型以区分比较因素
【发布时间】:2023-03-03 07:47:30
【问题描述】:

比较两个不同的 Y 变量时,没有真正的方法可以知道哪种图表类型属于哪个 Y 轴。 我需要一个说明哪种图表类型属于哪个数据集的图例。

在这个网站本身的帮助下,我已经能够使用不同的图表类型绘制不同的分类因子,但是正如你所看到的,没有办法分辨哪种图表类型属于哪个因子/变量

这是数据表(tm_daily_df),以及当前代码

   report_date shift     UTL_R  Head_Count
0   2019-03-17     A  0.669107          39
1   2019-03-18     A  0.602197          69
2   2019-03-19     A  0.568741          72
3   2019-03-20     A  0.552013          78
4   2019-03-21     A  0.585469          57
5   2019-03-22     A  0.635652          61
6   2019-03-23     A  0.602197          51
7   2019-03-17     1  0.828020          16
8   2019-03-17     2  0.585469           8
9   2019-03-17     3  0.526922          15
10  2019-03-18     1  0.618924          30
11  2019-03-18     2  0.610560          20
12  2019-03-18     3  0.577105          19
13  2019-03-19     1  0.610560          28
14  2019-03-19     2  0.602197          26
15  2019-03-19     3  0.468375          18
16  2019-03-20     1  0.543650          33
17  2019-03-20     2  0.552013          26
18  2019-03-20     3  0.552013          19
19  2019-03-21     1  0.577105          22
20  2019-03-21     2  0.585469          19
21  2019-03-21     3  0.602197          16
22  2019-03-22     1  0.593833          26
23  2019-03-22     2  0.685835          20
24  2019-03-22     3  0.635652          15
25  2019-03-23     1  0.577105          23
26  2019-03-23     2  0.627288          16
27  2019-03-23     3  0.602197          12
fig, ax = plt.subplots(figsize=(15,6))
g = sns.lineplot(x='report_date',  y='UTL_R', data=tm_daily_df, ax=ax, hue = 'shift', legend = None,
             marker='o', markersize=10)
ax2 = ax.twinx()
g = sns.barplot(x='report_date',  y='Head_Count', data=tm_daily_df, ax=ax2, hue='shift',alpha=.5)
ax.set_title('Utilization Ratio vs HeadCount')
plt.show()

我想有一个说明哪种图表类型属于哪个数据集的图例。在这种情况下,将有一个辅助图例显示一条线和单词“UTL_R”和一个正方形(或任何代表条形图的东西)旁边的单词 "Head_Count" 。 我也对可以定义应用图表类型的任何其他想法持开放态度。请记住,此图是大量变量中的一个,它不是单个实例。

如果这不可能,我是否可以将图像/小表格放入图中?

【问题讨论】:

    标签: python pandas matplotlib seaborn graphing


    【解决方案1】:

    tl;底部的博士

    我最近还需要在一个项目中实现两个图例。我的代码是这样的:

    def plot_my_data(ax, local_zerog, local_oneg, local_maxg):
        # local_zerog list looks like: [local_zerog_dcmdcl_names, local_zerog_dcmdcl_values, local_zerog_time2double_names, local_zerog_time2double_values]
        # the others are structured the same way as well
        mpl.rcParams["lines.markersize"] = 7
        dcmdcl = ax.scatter(local_zerog[0], local_zerog[1], label='Zero G', facecolors='none', edgecolors='b') #dcmdcl
        ax.scatter(local_oneg[0], local_oneg[1], label="One G", facecolors='none', edgecolors='g')
        ax.scatter(local_maxg[0], local_maxg[1], label="Max G", facecolors='none', edgecolors='r')
        ax.tick_params(axis="x", direction="in", top=False, labeltop=False, labelbottom=True)
        ax.tick_params(axis="y", direction="in", right=True)
        labels = ax.get_xticklabels()
        plt.setp(labels, rotation=90, horizontalalignment='center')
        legend1 = ax.legend(loc=1)
        time2double = ax.scatter(local_zerog[2], local_zerog[3], label='Zero G', marker='s', color='b') #time2double
        ax.scatter(local_oneg[2], local_oneg[3], label="One G", marker='s', color='g')
        ax.scatter(local_maxg[2], local_maxg[3], label="Max G", marker='s', color='r')
        ax.plot(local_oneg[0], [0 for _ in local_oneg[0]], color='k')  # line at 0
        ax.plot(local_oneg[2], [0 for _ in local_oneg[2]], color='k')
        ax.legend([dcmdcl, time2double], ["dcmdcl [%]", "time2double [s]"], loc=2)
        plt.gca().add_artist(legend1)
    

    我基本上有 6 组数据:3 组用于dcmdcl,3 组用于time2double。每个都有不同的颜色/形状,所以基本上我在线条中绘制了所有一个形状

    dcmdcl = ax.scatter(local_zerog[0], local_zerog[1], label='Zero G', facecolors='none', edgecolors='b') #dcmdcl
    ax.scatter(local_oneg[0], local_oneg[1], label="One G", facecolors='none', edgecolors='g')
    ax.scatter(local_maxg[0], local_maxg[1], label="Max G", facecolors='none', edgecolors='r')
    ax.tick_params(axis="x", direction="in", top=False, labeltop=False, labelbottom=True)
    ax.tick_params(axis="y", direction="in", right=True)
    labels = ax.get_xticklabels()
    plt.setp(labels, rotation=90, horizontalalignment='center')
    legend1 = ax.legend(loc=1)
    

    最后一行根据我分配的各种标签生成一个图例。现在要区分形状,我采用了一个dcmdcl 和一个time2double,并制作了另一个图例。相关代码为:

    dcmdcl = ax.scatter(local_zerog[0], local_zerog[1], label='Zero G', facecolors='none', edgecolors='b') #dcmdcl
    time2double = ax.scatter(local_zerog[2], local_zerog[3], label='Zero G', marker='s', color='b') #time2double
    ax.legend([dcmdcl, time2double], ["dcmdcl [%]", "time2double [s]"], loc=2)
    

    我基本上给它提供了两个特定的实例,并告诉它根据这些信息创建另一个图例并将其放置在另一个位置。

    tl;博士

    看起来你已经有了你想要的数据集的图例,所以现在你基本上需要运行:

    legend1 = ax.legend(['put a series of items you want to describe here'], ['put how you would like to title them (needs to be in same order as previous list)'], loc=2)
    plt.gca().add_artist(legend1)
    

    我认为这里的订单可能很重要(我不记得是从什么时候开始的),但如果你注意到我的订单是:

    • 绘制一些东西
    • legend1 = ax.legend(loc=1) 制作图例(尚未绘制,只是一个变量)
    • 绘制更多内容
    • ax.legend([dcmdcl, time2double], ["dcmdcl [%]", "time2double [s]"], loc=2)(注意这次没有赋值给变量)
    • plt.gca().add_artist(legend1) 现在我使用之前创建的变量通过add_artist() 绘制它

    我生成每个ax 的代码传递到我上面的函数中:

    fig = plt.figure(figsize=(15, 15))
    
    ax = fig.add_subplot(1, 3, 1)
    zerog, oneg, maxg = build_plot_data(lower_mach)
    plot_my_data(ax, zerog, oneg, maxg)
    ax.set_title("Mach < .7")
    

    【讨论】:

    • 我尝试应用您的图例输入,但出现此错误:ValueError:无法重置轴。您可能试图在多个不受支持的轴中重复使用艺术家
    • @ricsilo 我知道我的代码确实可以生成我的绘图,所以我没有做任何不受支持的事情。
    • “ValueError: 无法重置轴。您可能试图在多个不支持的轴中重新使用艺术家”是错误消息。我没有要求其他任何东西
    • 哦。您可以使用反引号 (`) 在 cmets 中对格式进行编码,例如 this,以避免这样的混淆。在我见过的所有多个图例代码中,它都遵循相同的格式。喜欢herehere
    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多