gpt4 book ai didi

r - 在 R 中制作 WCS Munsell 颜色图表,scale_fill_manual,ggplot2 中的顺序问题

转载 作者:行者123 更新时间:2023-12-05 08:46:37 29 4
gpt4 key购买 nike

我想为世界色彩调查所使用的色卡制作孟塞尔颜色图表。它应该看起来像这样:

enter image description here

所需的信息可以在 WCS 页面上找到,here ,我采取以下步骤:

library(munsell) # https://cran.r-project.org/web/packages/munsell/munsell.pdf
library(ggplot2)

# take the "cnum-vhcm-lab-new.txt" file from: https://www1.icsi.berkeley.edu/wcs/data.html#wmt
# change by replacing .50 with .5 removing .00 after hue values

WCS <- read.csv("cnum-vhcm-lab-new.txt", sep = "\t", header = T)
WCS$hex <- mnsl2hex(hvc2mnsl(hue = WCS$MunH, value = ceiling(WCS$MunV), chroma = WCS$C), fix = T)

# this works, but the order of tiles is messed up
ggplot(aes(x=H, y=V, fill=hex), data = WCS) +
geom_tile(aes(x=H, y=V), show.legend = F) +
scale_fill_manual(values = WCS$hex) +
scale_x_continuous(breaks = scales::pretty_breaks(n = 40))

结果:

enter image description here

显然,芯片不是按照色调和值排序,而是引用其他维度,甚至可能是原始数据框中的顺序。我还必须恢复 y 轴上的顺序。我想解决方案将与 factor()reorder() 相关,但该怎么做呢?

最佳答案

操作。 TL;DR - 您应该使用 scale_fill_identity() 而不是 scale_fill_manual()

现在进行详细描述:ggplot2 的核心功能是将数据的列映射到绘图上的特定特征,ggplot2 指的是使用 aes() 函数的“美学”。定位是通过将数据的某些列映射到 xy 美学来定义的,并且您的图 block 中的不同颜色被映射到 fill 使用 aes() 也是。

fill 的映射没有指定颜色,而只指定了哪些东西应该是不同的颜色。当以这种方式映射时,这意味着数据(观察)中在列中具有相同值的行映射到 fill 美学将是相同的颜色,并且在列中具有不同值的观察映射fill 美学将是不同的颜色。重要的是,这不会指定颜色,而只会指定颜色是否应该不同!

默认行为是 ggplot2 将通过应用默认比例来确定要使用的颜色。对于连续(数字)值,应用连续尺度,对于离散值(如字符向量),应用离散尺度。

要查看默认行为,只需从绘图代码中删除 scale_fill_manual(...)。我在下面重新复制了您的代码并添加了所需的修订,以编程方式删除和调整 ".50"".00"WCS$MunH< 的更改。如果您从您提供的链接下载了原始 .txt 文件,则下面的代码应该可以正常工作。

library(munsell)
library(ggplot2)

WCS <- read.csv("cnum-vhcm-lab-new.txt", sep = "\t", header = T)
WCS$MunH <- gsub('.50','.5', WCS$MunH) # remove trailing "0" after ".50"
WCS$MunH <- gsub('.00', '', WCS$MunH) # remove ".00" altogether

WCS$V <- factor(WCS$V) # needed to flip the axis

WCS$hex <- mnsl2hex(hvc2mnsl(hue = WCS$MunH, value = ceiling(WCS$MunV), chroma = WCS$C), fix = T)

ggplot(aes(x=H, y=V, fill=hex), data = WCS) +
geom_tile(aes(x=H, y=V), show.legend = F, width=0.8, height=0.8) +
scale_y_discrete(limits = rev(levels(WCS$V))) + # flipping the axis
scale_x_continuous(breaks = scales::pretty_breaks(n = 40)) +
coord_fixed() + # force all tiles to be "square"
theme(
panel.grid = element_blank()
)

enter image description here

那里有 show.legend = F,但是应该有 324 个不同的值映射到 WCS$hex 列(即 length(unique( WCS$hex))).

当使用 scale_fill_manual(values=...) 时,您提供了要使用的颜色的名称,但它们没有映射到列 WCS$ 中的相同位置十六进制。它们根据 ggplot2 决定组织 WCS$hex 级别的方式来应用,就好像它是一个因素一样。

为了告诉 ggplot2 基本上忽略映射,只根据您在映射到 fill 的列中看到的实际颜色名称​​着色,你使用 scale_fill_identity()。这将必然删除显示任何图例的能力,因为它有点删除映射和重新着色,这是 aes(fill=...) 的默认行为。无论如何,这应该可以解决您的问题:

ggplot(aes(x=H, y=V, fill=hex), data = WCS) +   
geom_tile(aes(x=H, y=V), width=0.8, height=0.8) +
scale_fill_identity() + # assign color based on text
scale_y_discrete(limits = rev(levels(WCS$V))) + # flipping the axis
scale_x_continuous(breaks = scales::pretty_breaks(n = 40)) +
coord_fixed() + # force all tiles to be "square"
theme(
panel.grid = element_blank()
)

enter image description here

关于r - 在 R 中制作 WCS Munsell 颜色图表,scale_fill_manual,ggplot2 中的顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69419940/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com