当我使用 时geom_density_ridges(),该图通常最终会显示数据中不存在的值的长尾。
下面是一个例子:
library(tidyverse)
library(ggridges)
data("lincoln_weather")
# Remove all negative values for "Minimum Temperature"
d <- lincoln_weather[lincoln_weather$`Min Temperature [F]`>=0,]
ggplot(d, aes(`Min Temperature [F]`, Month)) +
geom_density_ridges(rel_min_height=.01)
Run Code Online (Sandbox Code Playgroud)
如您所见,一月、二月和十二月都显示负温度,但数据中根本没有负值。
当然,我可以对 x 轴添加限制,但这并不能解决问题,因为它只是截断了现有的错误密度。
ggplot(d, aes(`Min Temperature [F]`, Month)) +
geom_density_ridges(rel_min_height=.01) +
xlim(0,80)
Run Code Online (Sandbox Code Playgroud)
现在,该图使 1 月和 2 月的值看起来为零(没有)。这也使得 0 度看起来在 12 月经常发生,而实际上只有 1 个这样的日子。
我怎样才能解决这个问题?
该包使用户可以根据有关行的条件语句gt轻松格式化单元格。我正在寻找一种根据单元格中的值格式化每个单元格的方法。
这就是我的意思。在下表中,我想根据每个单元格包含的值用 S&P 值对每个单元格进行着色。
library(gt)
library(dplyr)
library(tidyr)
# some arbitrary values of the S&P 500
jan08 <- sp500 %>%
filter(between(date, as.Date("2008-01-01"), as.Date("2008-01-15"))) %>%
select(date, open, high, low, close)
gt(jan08)
Run Code Online (Sandbox Code Playgroud)
此函数以字符串形式返回每个值的适当颜色名称。
## this is the range of values
sp500.range <- jan08 %>% pivot_longer(cols = c(open, high, low, close))
heat_palette <- leaflet::colorNumeric(palette = "YlOrRd",
domain = sp500.range$value)
# For example:
> heat_palette(1411.88)
[1] "#FEB852"
Run Code Online (Sandbox Code Playgroud)
每个单元格都可以手动着色,但这显然不实用。
gt(jan08) %>%
tab_style(style = cell_fill(color = heat_palette(1411.88)),
locations = cells_body(columns = "open",
rows = …Run Code Online (Sandbox Code Playgroud) 我正在制作一系列条形图,其中百分比值位于每个条形图上方.我想把它舍入到0位小数,但默认为小数点后1位.这是使用mtcars的示例.
library(ggplot2)
library(scales)
d <- mtcars
g <- ggplot(d, aes(gear)) +
geom_bar(aes(y = (..count..)/sum(..count..), fill=factor(..x..)), stat= "count")+
geom_text(aes(label = scales::percent((..count..)/sum(..count..)),
y= ((..count..)/sum(..count..))), stat="count",
vjust = -.25)
Run Code Online (Sandbox Code Playgroud)
有没有办法将它们舍入到最接近的整数,这样条形标记为47%,38%和16%?
解决方法可能包括手动注释标签或生成摘要data.frame,从中拉出标签.但是,由于我生成了大量的表,我更倾向于在单个ggplot命令中包含我的所有代码.
我正在使用Questionr包制作加权的行比例表。我想在列名太长时包装它们。因为我要制作数百个表,所以该解决方案需要在具有不同列数的表上工作。我也想避免将所有列设置为特定宽度。理想情况下,短列名称应保持其正常宽度,而超过指定最大长度的名称将被换行。
到目前为止,我尝试了很多解决方案,它们写为.Rmd文件:
---
title: "Example"
output: pdf_document
---
```{r setup, include=FALSE}
library(questionr)
library(knitr)
data("happy")
```
A simple weighted table with the "kable" method:
```{r table1, echo=TRUE}
kable(wtd.table(happy$degree, happy$happy, weights = happy$wtssall),
digits = 0)
```
The same "kable" table, but with row proportions:
```{r table2, echo=TRUE}
kable(rprop(wtd.table(happy$degree, happy$happy, weights = happy$wtssall)),
digits = 0)
```
I want to wrap the column headers, but kableExtra::column_spec() gives an error.
Even if it worked it requires manually setting each column width.:
```{r table3, …Run Code Online (Sandbox Code Playgroud) 在这个简单的示例中,我创建了一个包含颜色名称的变量。
df <- mtcars %>%
mutate(color = "green",
color = replace(color, cyl==6, "blue"),
color = replace(color, cyl==8, "red"))
Run Code Online (Sandbox Code Playgroud)
运行下面的代码可以按预期工作。
ggplot(df, aes(wt, mpg)) +
geom_point(color = df$color)
Run Code Online (Sandbox Code Playgroud)
如果我想使用 geom_line 创建三条线——绿色、蓝色和红色,该怎么办?
ggplot(df, aes(wt, mpg, group=cyl)) +
geom_line(color = df$color)
Run Code Online (Sandbox Code Playgroud)
如何使用带有颜色名称的变量来分配不同线条的颜色?
取一组 10 个点,像这样。
\nlibrary(tidyverse)\nlibrary(sf)\n\ndf.sf <- structure(list(component_number = c(51, 51, 51, 51, 51, 51, 51, \n51, 51, 51), geometry = structure(list(structure(c(2529693.76455455, \n437803.242940758), class = c("XY", "POINT", "sfg")), structure(c(2528862.86355918, \n436123.858325239), class = c("XY", "POINT", "sfg")), structure(c(2528991.21479502, \n436854.889372002), class = c("XY", "POINT", "sfg")), structure(c(2529138.56071318, \n436573.087631819), class = c("XY", "POINT", "sfg")), structure(c(2529133.32326354, \n436834.480073507), class = c("XY", "POINT", "sfg")), structure(c(2529133.70746582, \n437094.447431574), class = c("XY", "POINT", "sfg")), structure(c(2529134.07395407, \n437354.456933641), class = c("XY", "POINT", "sfg")), structure(c(2529193.24413696, \n437824.056422966), class = c("XY", "POINT", "sfg")), structure(c(2529456.32924802, \n437147.290262866), class = …Run Code Online (Sandbox Code Playgroud) 我写了一个函数来计算质心和多边形边缘之间的最大距离,但我无法弄清楚如何在一个简单特征("sf)data.frame的每个单独的多边形上运行它.
library(sf)
distance.func <- function(polygon){
max(st_distance(st_cast(polygon, "POINT"), st_centroid(polygon)))
}
Run Code Online (Sandbox Code Playgroud)
如果我在单个多边形上测试该函数,它就可以工作.(警告消息与当前问题无关).
nc <- st_read(system.file("shape/nc.shp", package="sf")) # built in w/package
nc.1row <- nc[c(1),] # Just keep the first polygon
>distance.func(nc.1row)
24309.07 m
Warning messages:
1: In st_cast.sf(polygon, "POINT") :
repeating attributes for all sub-geometries for which they may not be constant
2: In st_centroid.sfc(st_geometry(x), of_largest_polygon = of_largest_polygon) :
st_centroid does not give correct centroids for longitude/latitude data
Run Code Online (Sandbox Code Playgroud)
问题是将此函数应用于整个data.frame.
nc$distance <- apply(nc, 1, distance.func)
Error in UseMethod("st_cast") :
no applicable method for 'st_cast' …Run Code Online (Sandbox Code Playgroud) 我正在编写一个函数,其中我提供一个变量名作为符号。在函数的另一个步骤中,我想将变量名用作字符串。根据文档,rlang::as_string“将符号转换为字符串”。
这是一个基本的例子。此函数返回一个标题为 的列的小标题mean。
find_mean <- function(varname){
tibble(mean = mean(pull(mtcars, {{varname}})))
> find_mean(qsec)
# A tibble: 1 × 1
mean
<dbl>
1 17.8
Run Code Online (Sandbox Code Playgroud)
我想将变量名作为字符串添加另一列,如下所示:
# A tibble: 1 × 2
mean variable
<dbl> <chr>
1 17.8 qsec
Run Code Online (Sandbox Code Playgroud)
我以为这会奏效。
find_mean <- function(varname){
tibble(mean = mean(pull(mtcars, {{varname}})),
variable = rlang::as_string({{varname}}))
}
Run Code Online (Sandbox Code Playgroud)
但它返回此错误。
> find_mean(qsec)
Error in ~qsec : object 'qsec' not found
Run Code Online (Sandbox Code Playgroud)
我知道我在rlang的非标准评估规则方面犯了一些基本错误,但是谷歌搜索还没有帮助我弄清楚这一点。