【问题标题】:Plotly: Plot multiple pandas DataFrames in one graph with conditionsPlotly:在一个带有条件的图中绘制多个 pandas DataFrame
【发布时间】:2020-11-24 18:38:26
【问题描述】:

我有 4 个数据框用于 4 台不同的机器(df1、df2、df3、df4)。数据框的所有列都是相同的(相同的列名/特征)。

df1 的示例如下。

Day-Shift    Brand  Production
Day 06-26    A      438
Night 06-26  A      215
Day 06-27    B      120
Night 06-27  B      180
Day 06-28    B      500

df2 的示例如下。

Day-Shift    Brand  Production
Day 06-26    B      138
Night 06-26  B      205
Day 06-27    E      200
Night 06-27  E      190
Day 06-28    C      100

但机器的所有数据框品牌名称都包含品牌名称为B。我想要做的是在一个图表中为这 3 个数据框绘制 折线图(x 轴作为 Day-shift ,y 轴作为生产和 Brand 的颜色)。需要为每台机器指定固定颜色(例如:df1(machine 1) 使用红色)并且对于所有机器,Brand B 应该被可视化为 实线('-')所有其他品牌(例如:A、C、D、E等)为虚线('--')。

我在一张图表中绘制了不同的折线图。但我不知道如何像上面那样绘制。

【问题讨论】:

    标签: python python-3.x dataframe data-visualization plotly-python


    【解决方案1】:

    在下面的示例中,根据要求,每台机器都以自己的颜色绘制,品牌“B”以实线绘制,而其他品牌以虚线绘制。

    基本逻辑运行如下:

    • 为每台包含Production 值或None 的机器创建两个numpy 数组,具体取决于Brand 值。
      • 此技术使值数组长度保持相等,从而实现正确的 x 轴表示。
      • 名称:
        • (b1 (Mach.1, 品牌'B'), o1 (Mach.1, 品牌'other'))
        • (b2(2 马赫,“B”品牌),o2(2 马赫,“其他”品牌))
    • 遍历机器 1 的品牌并为每个品牌创建 命名 跟踪。
    • 遍历机器 2 的品牌并为每个品牌创建 命名 跟踪。
    • 绘制图表。

    示例代码:

    import numpy as np
    import pandas as pd
    from plotly.offline import iplot
    
    # Copied datasets from SO question.
    df1 = pd.read_clipboard()
    df2 = pd.read_clipboard()
    
    # Machine 1: Create numpy arrays of values for the given brand.
    b1 = np.where(df1['Brand'] == 'B', df1['Production'], None)
    o1 = np.where(df1['Brand'] != 'B', df1['Production'], None)
    # Machine 2: Same as above.
    b2 = np.where(df2['Brand'] == 'B', df2['Production'], None)
    o2 = np.where(df2['Brand'] != 'B', df2['Production'], None)
    
    # Setup.
    t = []
    line = ['solid', 'dash']
    brand = ['B', 'Other']
    
    # Machine 1: Create traces for brand B and Other.
    for i, Y in enumerate([b1, o1]):
        t.append({'x': df1['Day-Shift'], 
                  'y': Y, 
                  'name': f'Machine 1: {brand[i]}',
                  'line': {'color': 'red', 
                           'dash': line[i]}})
    
    # Machine 2: Create traces for brand B and Other.
    for i, Y in enumerate([b2, o2]):
        t.append({'x': df2['Day-Shift'], 
                  'y': Y,
                  'name': f'Machine 2: {brand[i]}',
                  'line': {'color': 'blue', 
                           'dash': line[i]}})
    
    # Plot the graph.
    iplot({'data': t})
    

    图表:

    评论(TL;DR):

    此处显示的示例代码使用较低级别的 Plotly API,而不是诸如 graph_objectsexpress 之类的便捷包装器。原因是我(个人)觉得展示“幕后”发生的事情对用户很有帮助,而不是用便利的包装器掩盖底层代码逻辑。

    这样,当用户需要修改图形的更精细细节时,他们将更好地理解 Plotly 为底层图形引擎(orca)构建的lists 和 dicts。

    【讨论】:

    • 哇..很好的解释..非常感谢,伙计。
    猜你喜欢
    • 2016-07-02
    • 2021-05-16
    • 2020-05-25
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多