#javascript #d3.js #colors
#javascript #d3.js #Цвет
Вопрос:
Существует ли встроенный метод для генерации монохроматических цветов с помощью библиотеки d3 при вводе цвета?
У меня есть поиск, но я ничего не нахожу.
Ближайший способ, который я сейчас понимаю, это:
- Преобразуйте предоставленный цвет в формат HSL
- Выберите насыщенность и сохраните ее как
s1
- Найдите минимальную насыщенность с помощью
s1-1
и сохраните ее какs2
- Интерполировать
s1
иs2
на 10 с помощью d3 - Используйте абсолютное значение интерполированной насыщенности для генерации цветовой палитры, фиксируя (H) ue и (L) ight
Есть ли какой-либо эффективный способ сделать это?
Ответ №1:
Для этого есть несколько способов. Один из них использует последовательную шкалу.
Например, учитывая указанный вами цвет (скажем, синий) в формате HSL…
const color = d3.hsl("blue");
… все, что вам нужно, это:
const scale = d3.scaleSequential(t => d3.hsl(color.h, color.s * t, color.l) "");
Значение, которое вы передадите интерполятору, изменяется от 0 до 1. Как вы можете видеть, мы умножим значение насыщенности на это число ( color.s * t
) , так что оно фактически перейдет от 0 к своему нормальному значению.
Вот демонстрация создания палитры с 40 значениями:
const color = d3.hsl("blue");
const scale = d3.scaleSequential(t => d3.hsl(color.h, color.s * t, color.l) "").domain([0, 40]);
d3.select("body")
.selectAll(null)
.data(d3.range(40))
.enter()
.append("div")
.style("background-color", d => scale(d))
div {
width: 10px;
height: 50px;
display: inline-block;
margin-right: 2px;
}
<script src="https://d3js.org/d3.v6.min.js"></script>
Комментарии:
1. Я обновил и добавил абсолютное значение в свой вопрос для обработки цветов с низкой насыщенностью . Можете ли вы соответствующим образом обновить свой ответ, чтобы я мог принять ваш ответ?
2. Я уже делаю то, что вы просили, H и L исправлены.
3. Мое абсолютное значение подразумевает, что я хочу интерполировать данные, предполагая, что насыщенность равна 0,4, между [от 0 до 0,4] и [от 0,4 до 1], а не только [от 0 до 0,4], как то, что вы сделали в своем решении. Но я думаю, что вы довольно близки к тому, что я хочу.