1 回答

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