1 回答

TA貢獻1847條經(jīng)驗 獲得超7個贊
介紹
你的問題可以利用更好的焦點,因為它實際上是兩個問題:
如何制作自定義色標
如何在繪圖中使用平日的變換顏色。
我冒昧地或多或少地專門關(guān)注后一部分。盡管我將簡要介紹前者的一些選項 - 如果您愿意,我們可以稍后再討論。
回答
這是一個有趣的問題,我認為我已經(jīng)通過對存儲在字典中的值的指定色階的循環(huán)迭代找到了一個可行的解決方案,daymap
其中鍵是工作日名稱:
daymap?=?{'Monday':cycle(px.colors.sequential.Reds),? ??????????'Tuesday':cycle(px.colors.sequential.Greens), ?????????}
px.colors.sequential.Reds
?并且px.colors.sequential.Greens
是內(nèi)置的繪圖色標。你特別要求黃色。但這是目前必須做的。
我已經(jīng)進行了設(shè)置,以便weekday, color scale
您設(shè)置的任何定義對都在圖中分配,并且您選擇不定義的所有工作日名稱都被賦予您使用自定義函數(shù)指定的單個自定義顏色colfx()
:
def colfx(daymap, day_name, default_color):
? ? if day_name in daymap.keys():
? ? ? ? return next(daymap[day_name])
? ? else:
? ? ? ? return default_color
下面的完整代碼片段以及 60 天的隨機數(shù)據(jù)樣本將使用上述規(guī)范以及其他一些細節(jié)生成下面的圖 1。
地塊1
圖 2 是通過在 中添加另一個鍵、值對daymap
并將默認顏色更改為colfx()
來生成的'rgba(150,150,150, 0.2)'
。我發(fā)現(xiàn)使用rgba
顏色作為默認顏色很實用,因為上一個術(shù)語0.2
可以讓您輕松設(shè)置顏色的不透明度。
地塊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()
添加回答
舉報