Предоставление шестнадцатеричных значений цвета для тепловой карты Plotnine

Я работаю с некоторыми данными и хотел бы создать тепловую карту с указанной заранее созданной цветовой палитрой. Фрейм данных показан ниже (в этом анализе я использую polars для всех операций с фреймом данных).

┌──────────────┬─────────────┬────────────────┬──────────────────────┬─────────┐
│ team1        ┆ team2       ┆ type           ┆ value                ┆ color   │
│ ---          ┆ ---         ┆ ---            ┆ ---                  ┆ ---     │
│ str          ┆ str         ┆ i64            ┆ f64                  ┆ str     │
╞══════════════╪═════════════╪════════════════╪══════════════════════╪═════════╡
│ team1_1      ┆ team2_1     ┆ 18             ┆ 115.850278           ┆ #443b84 │
│ team1_1      ┆ team2_2     ┆ 26             ┆ 24.241389            ┆ #470e61 │
│ team1_2      ┆ team2_2     ┆ 13             ┆ 3.278333             ┆ #440256 │
│ team1_1      ┆ team2_3     ┆ 30             ┆ 94.118333            ┆ #46327e │
│ team1_3      ┆ team2_3     ┆ 13             ┆ 35.186111            ┆ #481467 │
│ …            ┆ …           ┆ …              ┆ …                    ┆ …       │
│ team1_2      ┆ team2_1     ┆ 18             ┆ 67.937778            ┆ #482576 │
│ team1_2      ┆ team2_4     ┆ 22             ┆ 0.0                  ┆ #440154 │
│ team1_4      ┆ team2_2     ┆ 30             ┆ 1.199444             ┆ #440154 │
│ team1_1      ┆ team2_5     ┆ 15             ┆ 0.0                  ┆ #440154 │
│ team1_1      ┆ team2_3     ┆ 11             ┆ 8.345278             ┆ #450559 │
└──────────────┴─────────────┴────────────────┴──────────────────────┴─────────┘

В этом наборе данных я пытаюсь построить одну тепловую карту для каждой записи team2, но хочу сохранить одну палитру, чтобы тепловые карты были сопоставимы на разных графиках (т. е. темно-синий цвет на графике для team2_1). означает то же самое, что и темно-синий в сюжете для team2_5). Я создал столбец color, используя библиотеку mizani:

from mizani.palettes import cmap_pal

palette = cmap_pal("viridis")
palette_values = (df["value"] - df["value"].min()) / (
            df["value"].max() - df["value"].min()
        )
df = df.with_columns(color=pl.Series(palette(palette_values)))

Затем я перебираю все уникальные значения в столбце team2 и создаю тепловую карту, используя plotnine.

for t2 in df["team2"].unique():
  df1 = df.filter(pl.col("team2") == t2)
  color_dict = {
    key: value
    for key, value in zip(df1["value"], df1["color"])
  }
  plt = (
    pn.ggplot(
      data=df1.to_pandas(),
      mapping=pn.aes(
        x = "team1",
        y = "type",
        label = "value",
        fill = "value",
      ),
    )
    + pn.geom_tile(show_legend=False)
    + pn.scale_fill_manual(color_dict)
    + pn.geom_text(show_legend=False, size=9, format_string = "{:.2f}")
  )

Я получаю сообщение об ошибке plotnine: TypeError: Continuous value supplied to discrete scale. Как лучше всего реализовать то, что я хочу здесь?

Вы видели это?

Hericks 17.04.2024 17:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно сопоставить столбец color с эстетикой fill, а затем использовать scale_fill_identity.

plt = (
    pn.ggplot(
      data=df1.to_pandas(),
      mapping=pn.aes(
        x = "team1",
        y = "type",
        label = "value",
        fill = "color",
      ),
    )
    + pn.geom_tile(show_legend=False)
    + pn.scale_fill_identity()
    + pn.geom_text(show_legend=False, size=9, format_string = "{:.2f}")
  )

Другие вопросы по теме