Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 图形上的选择性粗体字体_R_Ggplot2 - Fatal编程技术网

R 图形上的选择性粗体字体

R 图形上的选择性粗体字体,r,ggplot2,R,Ggplot2,我正在用汇总统计数据注释我的图表。我想使用粗体字体快速吸引用户的目光,让他们看到分组中最好/最差的统计数据。突出显示的数字需要在运行时由数据本身确定 下面是一个使用ChickWeight数据集的示例,显示了基于饮食的小鸡体重变化: library(ggplot2) library(dplyr) # Calculate end vs start weights df <- merge(filter(ChickWeight, Time==21), filter(ChickWeight, Ti

我正在用汇总统计数据注释我的图表。我想使用粗体字体快速吸引用户的目光,让他们看到分组中最好/最差的统计数据。突出显示的数字需要在运行时由数据本身确定

下面是一个使用ChickWeight数据集的示例,显示了基于饮食的小鸡体重变化:

library(ggplot2)
library(dplyr)

# Calculate end vs start weights
df <- merge(filter(ChickWeight, Time==21), filter(ChickWeight, Time==0), by=c("Chick", "Diet"))
df$dWeight <- df$weight.x - df$weight.y

# Summary statistics: sd & mean
df.stat <- do.call(data.frame, 
                   aggregate(dWeight ~ Diet, 
                             data=df, 
                             FUN = function(x) c(SD=sd(x), MN=mean(x))))

ggplot(data = df) + 
    facet_grid(Diet ~ .) +
    geom_histogram(binwidth=10, aes(x=dWeight)) + 
    geom_vline(data=df.stat, aes(xintercept = dWeight.MN), color="black") + 
    geom_text(data=df.stat, aes(x=Inf, 
                                y=Inf, 
                                label = sprintf("\nmean = %4.1f\nsd = %4.1f", 
                                                dWeight.MN, dWeight.SD), 
                                hjust=1, 
                                vjust=1)) 
库(ggplot2)
图书馆(dplyr)
#计算结束权重与开始权重
df

如果你不想,你可以给你的打印标签添加一个条件,你会非常接近的

资料 解释 使用
fontface=
可以将
geom_text()设置为斜体或粗体。
表达式中的
ifelse()
检查该值是否等于全局最大值/最小值,如果为true,则将文本设置为粗体(
=2
),如果为false,则保留为纯文本(
=1

如果你不想,你可以给你的打印标签添加一个条件,你会非常接近的

资料 解释 使用
fontface=
可以将
geom_text()设置为斜体或粗体。
表达式中的
ifelse()
检查该值是否等于全局最大值/最小值,如果为true,则将文本设置为粗体(
=2
),如果为false,则保留为纯文本(
=1

借鉴@Roman的
ifelse
思想,下面是一个使用
latex2exp
库构建LaTeX字符串的解决方案,该字符串允许在字符串中更改字体
latex2exp
将TeX字符串转换为plotmath表达式

仍然不完美,不能扩展到两行文字之外
latex2exp
,迫使我使用
overset

另一个LaTeX选项是{nx1}矩阵,但
latex2exp
也不支持矩阵(运行
latex2exp\u supported()
查看支持哪些LaTeX表达式)

或两个单独的
geom_text
命令,如果在用户调整或缩放绘图时有可靠的间距和对齐文本的方法

此解决方案仅限于两条只能彼此居中对齐的直线

数据

library(ggplot2)
library(dplyr)
library(latex2exp)

# Calculate end - start weights
df <- inner_join(filter(ChickWeight, Time==21), 
                 filter(ChickWeight, Time==0), 
                 by=c("Chick", "Diet")) %>%
      mutate(dWeight=weight.x-weight.y) %>% 
      select(Chick, Diet, dWeight)

# Summary statistics: sd & mean
df.stats <- df %>% 
            group_by(Diet) %>% 
            summarise(MN=mean(dWeight), SD=sd(dWeight)) %>% 
            mutate(is.max.MN=(MN==max(MN))) %>% 
            mutate(is.min.SD=(SD==min(SD)))
geom_text
标签
aes
函数之外,该函数似乎不继承数据命名空间

此外,此ggplot命令还会生成一条警告消息(
TeX
语句):
在is.na(x)中:is.na()应用于“expression”类型的非-(列表或向量)

借鉴@Roman的
ifelse
思想,下面是一个使用
latex2exp
库构建LaTeX字符串的解决方案,该字符串允许在字符串中更改字体
latex2exp
将TeX字符串转换为plotmath表达式

仍然不完美,不能扩展到两行文字之外
latex2exp
,迫使我使用
overset

另一个LaTeX选项是{nx1}矩阵,但
latex2exp
也不支持矩阵(运行
latex2exp\u supported()
查看支持哪些LaTeX表达式)

或两个单独的
geom_text
命令,如果在用户调整或缩放绘图时有可靠的间距和对齐文本的方法

此解决方案仅限于两条只能彼此居中对齐的直线

数据

library(ggplot2)
library(dplyr)
library(latex2exp)

# Calculate end - start weights
df <- inner_join(filter(ChickWeight, Time==21), 
                 filter(ChickWeight, Time==0), 
                 by=c("Chick", "Diet")) %>%
      mutate(dWeight=weight.x-weight.y) %>% 
      select(Chick, Diet, dWeight)

# Summary statistics: sd & mean
df.stats <- df %>% 
            group_by(Diet) %>% 
            summarise(MN=mean(dWeight), SD=sd(dWeight)) %>% 
            mutate(is.max.MN=(MN==max(MN))) %>% 
            mutate(is.min.SD=(SD==min(SD)))
geom_text
标签
aes
函数之外,该函数似乎不继承数据命名空间

此外,此ggplot命令还会生成一条警告消息(
TeX
语句):

在is.na(x)中:is.na()应用于“expression”类型的非-(列表或向量)

只将文本的一部分加粗,尤其是由变量给出的部分加粗是一件棘手的事情,看起来您需要类似的东西。@JuliusVainora,这种技术似乎需要两次
geom_text()
调用。一个用于打印非粗体文本,另一个用于打印粗体文本,将其他部分保留为幻影()
。我不知道如何使用
facet\u grid()。我完全不知道如何在plotmath中使用
expression()
bquote()
substitute()
,等等。每次尝试都会给出一条新的错误消息,这会导致另一个兔子洞。只将文本的一部分,特别是由变量给出的部分加粗是很棘手的,看起来您需要这样的东西。@JuliusVainora,这种技术似乎需要两次
geom_text()
调用。一个用于打印非粗体文本,另一个用于打印粗体文本,将其他部分保留为幻影()
。我不知道如何使用
facet\u grid()。我完全不知道如何在plotmath中使用
expression()
bquote()
substitute()
,等等。每次尝试都会产生一条新的错误消息,导致另一个兔子洞被追赶。使用您的技术和
latex2exp
库,我能够修改
geom_text
语句,只将数字加粗如下:
label=TeX(sprintf(ifelse)(df.plot$dWeight.MN==df.plot$dWeight.MN.max,“mean=\\textbf{%4.1f}”,“mean=%4.1f”),df.plot$dwweight.MN))
干得好!您应该将您的方法作为答案发布并自己接受。这样,此问题将不再标记为“打开”“。看看如何接受答案。使用您的技巧和
latex2exp
库,我可以修改
geom_text
语句,只将数字加粗如下:
label=TeX(sprintf(ifelse(df.plot$dWeight.MN==df.plot$dWeight.MN.max,“mean=\\textbf{%4.1f}”,“mean=%4.1f”),df.plot$dWeight.MN))
很棒的工作!你应该把你的方法作为一个答案,并自己接受它。这样,此问题将不再标记为“打开”。看见
library(ggplot2)
library(dplyr)
library(latex2exp)

# Calculate end - start weights
df <- inner_join(filter(ChickWeight, Time==21), 
                 filter(ChickWeight, Time==0), 
                 by=c("Chick", "Diet")) %>%
      mutate(dWeight=weight.x-weight.y) %>% 
      select(Chick, Diet, dWeight)

# Summary statistics: sd & mean
df.stats <- df %>% 
            group_by(Diet) %>% 
            summarise(MN=mean(dWeight), SD=sd(dWeight)) %>% 
            mutate(is.max.MN=(MN==max(MN))) %>% 
            mutate(is.min.SD=(SD==min(SD)))
ggplot(data=df) + 
    facet_grid(Diet ~ .) +
    geom_histogram(binwidth=10, aes(x=dWeight)) + 
    geom_vline(data=df.stats, aes(xintercept = MN), color="black") + 
    geom_text(data=df.stats,
              aes(x=Inf, 
                  y=Inf, 
                  hjust=1, 
                  vjust=1),
              label = TeX(paste("\\overset{mean =", 
                                sprintf(ifelse(df.stats$is.max.MN, "\\textbf{%4.1f}", "%4.1f"), df.stats$MN),
                                "}{sd =",
                                sprintf(ifelse(df.stats$is.min.SD, "\\textbf{%4.1f} $", "%4.1f"), df.stats$SD),
                                "}"
                          )))