Plotly:如何在plotly时间轴图中使用两组颜色?
Plotly: how to use two sets of colors in plotly timeline figure?
我使用 plotly express 在“y”轴上绘制了一个带有两个标签的时间序列条形图。 “颜色”标签基于第三类。这是简化代码和输出的快照:
import pandas as pd
import datetime
import plotly.express as px
df = pd.DataFrame(dict({
'beginTime': [
datetime.datetime.strptime('1/1/2008 1:00:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:15:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 2:00:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:00:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:02:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:20:15', '%m/%d/%Y %H:%M:%S'),
],
'endTime': [
datetime.datetime.strptime('1/1/2008 1:10:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:35:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 2:07:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:8:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:12:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:59:15', '%m/%d/%Y %H:%M:%S'),
],
'type': ['1', '1', '1', '2', '2', '2'],
'activity': ['competition1', 'competition1', 'competition1', 'competition2', 'competition2', 'competition2'],
'label': ['eat', 'sleep', 'write', 'write', 'code', 'sleep']
}
))
fig = px.timeline(df, x_start="beginTime", x_end="endTime", y="type", color='label')
fig.show()
我的问题是,
- 如何为“y”轴上的每个标签应用两组单独的颜色(这样颜色就不会重叠)?
- 或者如何将两组“颜色”图应用到一个时间线图中?
- 您可以为每个 y 创建轨迹,每个 y 具有不同的颜色序列
- 使用图对象
整合这些轨迹
import pandas as pd
import datetime
import plotly.express as px
import inspect
import plotly.graph_objects as go
df = pd.DataFrame(
dict(
{
"beginTime": [
datetime.datetime.strptime("1/1/2008 1:00:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:15:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 2:00:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:00:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:02:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:20:15", "%m/%d/%Y %H:%M:%S"),
],
"endTime": [
datetime.datetime.strptime("1/1/2008 1:10:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:35:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 2:07:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:8:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:12:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:59:15", "%m/%d/%Y %H:%M:%S"),
],
"type": ["1", "1", "1", "2", "2", "2"],
"activity": [
"competition1",
"competition1",
"competition1",
"competition2",
"competition2",
"competition2",
],
"label": ["eat", "sleep", "write", "write", "code", "sleep"],
}
)
)
# create a figure for each y with different color sequence
figs = [
px.timeline(
g[1],
x_start="beginTime",
x_end="endTime",
y="type",
color="label",
color_discrete_sequence={a:b for a,b in inspect.getmembers(px.colors.qualitative)}[cs],
)
for g,cs in zip(df.groupby("type"), ["Alphabet","G10"])
]
# integrate it
go.Figure(data=[d for f in figs for d in f.data ], layout=figs[0].layout)
我使用 plotly express 在“y”轴上绘制了一个带有两个标签的时间序列条形图。 “颜色”标签基于第三类。这是简化代码和输出的快照:
import pandas as pd
import datetime
import plotly.express as px
df = pd.DataFrame(dict({
'beginTime': [
datetime.datetime.strptime('1/1/2008 1:00:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:15:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 2:00:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:00:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:02:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:20:15', '%m/%d/%Y %H:%M:%S'),
],
'endTime': [
datetime.datetime.strptime('1/1/2008 1:10:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:35:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 2:07:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:8:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:12:15', '%m/%d/%Y %H:%M:%S'),
datetime.datetime.strptime('1/1/2008 1:59:15', '%m/%d/%Y %H:%M:%S'),
],
'type': ['1', '1', '1', '2', '2', '2'],
'activity': ['competition1', 'competition1', 'competition1', 'competition2', 'competition2', 'competition2'],
'label': ['eat', 'sleep', 'write', 'write', 'code', 'sleep']
}
))
fig = px.timeline(df, x_start="beginTime", x_end="endTime", y="type", color='label')
fig.show()
我的问题是,
- 如何为“y”轴上的每个标签应用两组单独的颜色(这样颜色就不会重叠)?
- 或者如何将两组“颜色”图应用到一个时间线图中?
- 您可以为每个 y 创建轨迹,每个 y 具有不同的颜色序列
- 使用图对象 整合这些轨迹
import pandas as pd
import datetime
import plotly.express as px
import inspect
import plotly.graph_objects as go
df = pd.DataFrame(
dict(
{
"beginTime": [
datetime.datetime.strptime("1/1/2008 1:00:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:15:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 2:00:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:00:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:02:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:20:15", "%m/%d/%Y %H:%M:%S"),
],
"endTime": [
datetime.datetime.strptime("1/1/2008 1:10:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:35:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 2:07:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:8:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:12:15", "%m/%d/%Y %H:%M:%S"),
datetime.datetime.strptime("1/1/2008 1:59:15", "%m/%d/%Y %H:%M:%S"),
],
"type": ["1", "1", "1", "2", "2", "2"],
"activity": [
"competition1",
"competition1",
"competition1",
"competition2",
"competition2",
"competition2",
],
"label": ["eat", "sleep", "write", "write", "code", "sleep"],
}
)
)
# create a figure for each y with different color sequence
figs = [
px.timeline(
g[1],
x_start="beginTime",
x_end="endTime",
y="type",
color="label",
color_discrete_sequence={a:b for a,b in inspect.getmembers(px.colors.qualitative)}[cs],
)
for g,cs in zip(df.groupby("type"), ["Alphabet","G10"])
]
# integrate it
go.Figure(data=[d for f in figs for d in f.data ], layout=figs[0].layout)