Plotly:在具有条件的一张图中绘制多个 pandas DataFrame

Plotly: Plot multiple pandas DataFrames in one graph with conditions

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

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

但是机器的所有数据框Brand name包括Brand called B。我想要做的是在一张图中为这 3 个数据框绘制 折线图 (x 轴作为日班,y 轴作为生产和品牌颜色)。需要为每台机器提供固定颜色(例如:df1(机器 1)使用红色)并且对于所有机器,品牌 B 应该是显示为 实线('-') 所有其他品牌(例如:A、C、D、E 等)显示为虚线('- -').

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

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

基本逻辑运行如下:

  • 为每台机器创建两个包含 Production 值或 None 的 numpy 数组,具体取决于 Brand 值。
    • 此技术使值数组长度保持相等,从而实现正确的 x 轴表示。
    • 姓名:
      • (b1(1 号机,品牌 'B'),o1(1 号机,品牌 'other'))
      • (b2(2 号机,品牌 'B'),o2(2 号机,品牌 'other'))
  • 遍历机器 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})

图表:

评论(长话短说;博士):

此处显示的示例代码使用较低级别的 Plotly API,而不是 graph_objectsexpress 等便捷包装器。原因是我(个人)觉得向用户展示正在发生的事情是有帮助的'under the hood',而不是用一个方便的包装器来掩盖底层代码逻辑。

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