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_objects
到 express
等便捷包装器。原因是我(个人)觉得向用户展示正在发生的事情是有帮助的'under the hood',而不是用一个方便的包装器来掩盖底层代码逻辑。
这样,当用户需要修改图形的更精细细节时,他们将更好地理解 Plotly 正在为底层图形构建的 list
s 和 dict
s引擎(逆戟鲸)。
我有 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_objects
到 express
等便捷包装器。原因是我(个人)觉得向用户展示正在发生的事情是有帮助的'under the hood',而不是用一个方便的包装器来掩盖底层代码逻辑。
这样,当用户需要修改图形的更精细细节时,他们将更好地理解 Plotly 正在为底层图形构建的 list
s 和 dict
s引擎(逆戟鲸)。