[英]Plotly: Plot multiple pandas DataFrames in one graph with conditions
我有 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
但是机器的所有数据帧 Brand name 都包括Brand 称为B 。 我想要做的是在一张图中绘制这 3 个数据框的折线图(x 轴作为 Day-shift ,y 轴作为生产和颜色与 Brand)。 需要为每台机器(例如:df1(machine 1) using red)和所有机器提供固定颜色,品牌 B应可视化为实线('-')和所有其他品牌(例如:A, C、D、E 等)作为虚线('--')。
我在一张图中绘制了不同的折线图。 但我不知道如何像上面那样绘制。
在下面的示例中,每台机器都以自己的颜色绘制,品牌“B”用实线绘制,而其他品牌则按照要求用虚线绘制。
基本逻辑如下:
Production
值或None
每台机器创建两个 numpy 数组,具体取决于Brand
值。
b1
(马赫. 1, 品牌'B'), o1
(马赫. 1, 品牌'其他'))b2
(Mach. 2, 品牌'B'), o2
(Mach. 2, 品牌'other'))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_objects
这样的便利包装器来express
. 原因是我(个人)觉得展示“幕后”发生的事情对用户有帮助,而不是用方便的包装器掩盖底层代码逻辑。
这样,当用户需要修改图形的更精细细节时,他们将对 Plotly 为底层图形引擎(orca)构建的list
和dict
有更好的理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.