1 回答
TA贡献1847条经验 获得超7个赞
介绍
你的问题可以利用更好的焦点,因为它实际上是两个问题:
如何制作自定义色标
如何在绘图中使用平日的变换颜色。
我冒昧地或多或少地专门关注后一部分。尽管我将简要介绍前者的一些选项 - 如果您愿意,我们可以稍后再讨论。
回答
这是一个有趣的问题,我认为我已经通过对存储在字典中的值的指定色阶的循环迭代找到了一个可行的解决方案,daymap
其中键是工作日名称:
daymap = {'Monday':cycle(px.colors.sequential.Reds), 'Tuesday':cycle(px.colors.sequential.Greens), }
px.colors.sequential.Reds
并且px.colors.sequential.Greens
是内置的绘图色标。你特别要求黄色。但这是目前必须做的。
我已经进行了设置,以便weekday, color scale
您设置的任何定义对都在图中分配,并且您选择不定义的所有工作日名称都被赋予您使用自定义函数指定的单个自定义颜色colfx()
:
def colfx(daymap, day_name, default_color):
if day_name in daymap.keys():
return next(daymap[day_name])
else:
return default_color
下面的完整代码片段以及 60 天的随机数据样本将使用上述规范以及其他一些细节生成下面的图 1。
地块1
图 2 是通过在 中添加另一个键、值对daymap
并将默认颜色更改为colfx()
来生成的'rgba(150,150,150, 0.2)'
。我发现使用rgba
颜色作为默认颜色很实用,因为上一个术语0.2
可以让您轻松设置颜色的不透明度。
地块2
完整代码
import pandas as pd
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
from itertools import cycle
# data
obs = 60
dates = pd.date_range(start='2020-01-01', periods=obs)
random = np.random.RandomState(0)
df = pd.DataFrame({'data': np.random.uniform(low=0, high=100, size=obs).tolist()}, index=dates)
# custom function to assign next color in a color sequence
# for each new day defined in the dict daymap
def colfx(daymap, day_name, default_color):
if day_name in daymap.keys():
return next(daymap[day_name])
else:
return default_color
# color specifications for weekday
daymap = {'Monday':cycle(px.colors.sequential.Reds),
'Tuesday':cycle(px.colors.sequential.Greens),
'Friday':cycle(px.colors.sequential.thermal)
}
# container for weekday names added to the figure legend
# if the weekday names has ALREADY been added to the legend,
# then no further additions are made
fignames = []
fig=go.Figure()
for row in df.iterrows():
day_name=row[0].strftime("%A")
fignames = [d.name for d in fig.data]
fig.add_bar(x=[row[0]],
y=[row[1]['data']],
marker_color=colfx(daymap=daymap, day_name = day_name, default_color='rgba(150,150,150, 0.2)'),
name=day_name,
legendgroup = day_name,
showlegend = False if day_name in fignames else True
)
fig.show()
添加回答
举报