我想使用ggplot绘制直方图(或使用的步骤图stat_bin)并使用它覆盖几个点geom_point.
这是一个base实现:
library(plotrix)
set.seed(10)
df <- data.frame(id=LETTERS,val=rnorm(length(LETTERS)))
selected.ids <- sample(LETTERS,3,replace=F)
h <- hist(df$val,plot=F,breaks=10)
cols <- sapply(rainbow(length(selected.ids)),function(x) color.id(x)[1])
selected.df <- data.frame(id=selected.ids,col=cols,stringsAsFactors=F)
selected.df$x <- df$val[which(df$id %in% selected.ids)]
selected.df <- selected.df[order(selected.df$x),]
selected.df$y <- h$counts[findInterval(selected.df$x,h$breaks)]
selected.df$col <- factor(selected.df$col,levels=cols)
plot(h)
segments(x0=selected.df$x,x1=selected.df$x,y0=selected.df$y,y1=selected.df$y,cex=18,lwd=8,col=selected.df$col)
Run Code Online (Sandbox Code Playgroud)
这使:
但是,当我尝试ggplot:
ggplot(df,aes(x=val))+geom_histogram(bins=10,colour="black",alpha=0,fill="#FF6666")+geom_point(data=selected.df,aes(x=x,y=y,colour=factor(col)),size=2)+scale_fill_manual(values=levels(selected.df$col),labels=selected.df$id,name="id")+scale_colour_manual(values=levels(selected.df$col),labels=selected.df$id,name="id")
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想使用步骤图绘制它:
ggplot(df,aes(x=val))+stat_bin(geom="step",bins=10)+geom_point(data=selected.df,aes(x=x,y=y,colour=factor(col)),size=2)+scale_fill_manual(values=levels(selected.df$col),labels=selected.df$id,name="id")+scale_colour_manual(values=levels(selected.df$col),labels=selected.df$id,name="id")
Run Code Online (Sandbox Code Playgroud)
这看起来非常像 geom_histogram
而且我也想让线的末端触及y = 0线.
所以我使用stat_bin在步骤图中得到正确的结果?
我正在尝试使用R plotly'sbar type plot 生成一个带有水平布局框的图,并在其背景中添加一条水平线(而不是在它们之上)。此外,我希望这条线在每个方向上对称地延伸一个盒子单元。
这是我在做什么:
plot.df <- data.frame(x = paste0("LONG NAME ",1:6),y = 0.2,width=0.75,group = c("A","B","B","B","C","A"),stringsAsFactors = F)
plot.df$group <- factor(plot.df$group)
plotly::plot_ly(plot.df) %>%
plotly::add_trace(x=~x,y=~y/2,type='scatter',mode='lines',line=list(color='black'),showlegend=F) %>%
plotly::add_bars(x=~x,y=~y,width=~width,color=~group) %>%
plotly::layout(xaxis=list(title=NA,zeroline=F,tickangle=45),yaxis=list(title=NA,zeroline=F,showgrid=F,range=c(0,1),showticklabels=F))
Run Code Online (Sandbox Code Playgroud)
这使:
我的问题是:
plot.df$y为 0.2 但yaxis范围c(0,1)要使框看起来不像长条。但随后传说就显得太高了。有什么更好的方法可以让方块的图例看起来比现在低?我试图垂直组合条形图,共享它们的x轴。
我想用的R的plotly的subplot的这一点,但运行到一个问题,我希望有人在这里可能有一个解决方案。
以下是具有28个组的示例数据,其中我在每个组中创建了4个系列的条形图,然后尝试使用plotly::subplot以下方法垂直组合它们:
set.seed(1)
df <- data.frame(group = paste0("G",unlist(lapply(1:28,function(i) rep(i,4)))),
family = paste0("F",rep(1:4,28)),
log2n = log2(as.integer(runif(4*28,0,30))+1),
stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)
创建条形图列表:
library(plotly)
library(dplyr)
groups <- unique(df$group)
y.range <- c(0,max(df$log2n))
plot.list <- lapply(1:length(groups),function(g){
group.df <- dplyr::filter(df,group == groups[g])
plot_ly(x=group.df$family,y=group.df$log2n,type='bar',name=group.df$family,color=group.df$family,showlegend=(g==length(groups))) %>%
layout(yaxis=list(range=y.range))
})
Run Code Online (Sandbox Code Playgroud)
如果我尝试:
plotly::subplot(plot.list,shareX=T,nrows=length(plot.list))
Run Code Online (Sandbox Code Playgroud)
So it seems like some sort of an overflow.
I gradually cut down on the number of plots in plot.list that I run subplot on and when reached 19 …
我有xy我想使用R's绘制的数据ggplot:
library(dplyr)
library(ggplot2)
set.seed(1)
df <- data.frame(group = unlist(lapply(LETTERS[1:5],function(l) rep(l,5))),
x = rep(1:5,5),
y = rnorm(25,2,1),
y.se = runif(25,0,0.1)) %>%
dplyr::mutate(y.min = y-3*y.se,
y.low = y-y.se,
y.high = y+y.se,
y.max = y+3*y.se)
Run Code Online (Sandbox Code Playgroud)
如您所见,whiledf$x是一个点 ( integer),df$y有一个相关的错误,我想使用箱线图将其包含在内。
所以我的目的是df按其x坐标绘制每一行,使用y.min, y.low, y, y.high, 并y.max构造 a boxplot, colorand fillit by group。这意味着,我希望将 中的每一行df绘制为box沿单独x-axis位置的 a …
假设我有一个数字matrix:
set.seed(1)
mat <- matrix(rnorm(1000), ncol = 100)
Run Code Online (Sandbox Code Playgroud)
我想生成所有向量,这些向量是所有唯一向量对的元素乘积的结果mat.
我们如何改进以下代码:
all.pairs <- t(combn(1:ncol(mat), 2))
res <-
do.call(cbind,
lapply(1:nrow(all.pairs),
function(p) mat[, all.pairs[p, 1]] * mat[, all.pairs[p, 2]]))
Run Code Online (Sandbox Code Playgroud) 我有一个list的character vectorS:
my.list <- list(e1 = c("a","b","c","k"),e2 = c("b","d","e"),e3 = c("t","d","g","a","f"))
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个function对于任何character横跨出现不止一次list的vectorS(在每vector一个character只能出现一次),将只保留第一次亮相.
因此,此示例的结果列表将是:
res.list <- list(e1 = c("a","b","c","k"),e2 = c("d","e"),e3 = c("t","g","f"))
Run Code Online (Sandbox Code Playgroud)
注意,可以消除整个vector中的list整数,使得结果list中的元素数量不一定必须等于输入list.
我想添加annotation到scatter由R'splotly包生成的绘图中,并以粗体显示文本。
我想:
library(plotly)
library(dplyr)
set.seed(1)
df <- data.frame(x=rnorm(10),y=rnorm(10))
plotly::plot_ly(x =~ df$x, y =~ df$y,marker = list(size=12), type = 'scatter',mode = "markers") %>%
plotly::add_annotations(text=1:10,showarrow=T,arrowhead=1,x=df$x,y=df$y,font=list(size=10))
Run Code Online (Sandbox Code Playgroud)
试图添加face="bold"到font规范list:
plotly::plot_ly(x =~ df$x, y =~ df$y,marker = list(size=12), type = 'scatter',mode = "markers") %>%
plotly::add_annotations(text=1:10,showarrow=T,arrowhead=1,x=df$x,y=df$y,font=list(size=10,face="bold"))
Run Code Online (Sandbox Code Playgroud)
所以问题是如何让该文本注释以粗体显示。
PS 在我的真实数据中,我想注释点簇,因此注释作为一个单独的层出现。
我有一个data.frame对于其列的子集来说不是唯一的,我想要做的是获取非唯一列的唯一部分以及相应的聚合(通过collapse)唯一列。
这是一个例子:
library(dplyr)
set.seed(1)
df <- data.frame(v1=rnorm(5), v2=rnorm(5), v3=rnorm(5), id=paste0("id",1:5))
#Replicate a couple of rows adding different ids:
df <- df %>% rbind(df[sample(5,2,replace = F),] %>% dplyr::mutate(id=paste0("id",6:7)))
> df
v1 v2 v3 id
1 -0.6264538 -0.8204684 1.5117812 id1
2 0.1836433 0.4874291 0.3898432 id2
3 -0.8356286 0.7383247 -0.6212406 id3
4 1.5952808 0.5757814 -2.2146999 id4
5 0.3295078 -0.3053884 1.1249309 id5
6 -0.8356286 0.7383247 -0.6212406 id6
7 0.3295078 -0.3053884 1.1249309 id7
Run Code Online (Sandbox Code Playgroud)
由于复制了第 3 行和第 5 行,结果data.frame将是:
> …Run Code Online (Sandbox Code Playgroud) 我有一个n x n numpy float64 sparse matrix( data, where n = 44),其中行和列是图形节点,值是边权重:
>>> data
<44x44 sparse matrix of type '<class 'numpy.float64'>'
with 668 stored elements in Compressed Sparse Row format>
>>> type(data)
<class 'scipy.sparse.csr.csr_matrix'>
>>> print(data)
(0, 7) 0.11793236293516568
(0, 9) 0.10992000939300195
(0, 21) 0.7422196678913772
(0, 23) 0.0630039712667936
(0, 24) 0.027037442463504143
(0, 27) 0.16908845414214152
(0, 28) 0.6109227233402952
(0, 32) 0.0514765253537568
(0, 33) 0.016341754080557713
(1, 6) 0.015070325434709386
(1, 10) 9.346673769086203e-05
(1, 11) 0.2471018034781923
(1, 14) 0.0020684269551621776
(1, …Run Code Online (Sandbox Code Playgroud) 我有一个data.frame将一id列映射到一group列的列,并且该id列不是唯一的,因为它id可以映射到多个groups:
set.seed(1)
df <- data.frame(id = paste0("id", sample(1:10,300,replace = T)), group = c(rep("A",100), rep("B",100), rep("C",100)), stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)
我想将其转换data.frame为 a list,其中每个元素都是 each 中的ids group。
对于我正在处理的数据大小,这似乎有点慢:
library(dplyr)
df.list <- lapply(unique(df$group), function(g) dplyr::filter(df, group == g)$id)
Run Code Online (Sandbox Code Playgroud)
所以我在想这个:
df.list <- df %>%
dplyr::group_by(group) %>%
dplyr::group_split()
Run Code Online (Sandbox Code Playgroud)
假设它比我的第一个选项快,知道如何让它返回与第一个选项相同的输出而不是data.frames列表吗?