我正在寻找创建一个可在Web浏览器中查看的静态仪表板.而且我想创建像Stephen Few在他的书" 信息仪表板设计"中所做的那样的事情.(见底部示例)
如果网格可以很容易地做到这一点,你知道有什么好的资源来学习如何使用它吗?我已经阅读了手册,但我发现它没有太大帮助.我见过LearnR博客的ggplot2销售仪表板(它使用网格),我无法理解网格和布局部分内容.
dasboard示例http://img251.imageshack.us/img251/1029/fewciodashboard800.png
我希望我可以将漂亮的导入和绘图功能grImport
与令人敬畏的图形功能相结合ggplot2
,但我根本不理解grid
系统,以找到实现我想要的优雅方式.我想要的是用ggplot2
图表导入的图像替换图表中的x轴刻度标签grImport
.
由于两个软件包都使用grid
函数,我希望有一种方法grid.symbols()
可以在ggplot2
框架内使用,这是理想的,或者至少在设备中的现有图上使用.知道这些事情的人是否知道这样做的有效方法?或者,任何人都可以向我指出更多信息,以帮助我了解grobs,视口等?我已经阅读了关于Grid图形模型的Paul Murrel的R图形书的免费章节,但是我对ggplot2的内部工作原理并不熟悉,无法建立链接.
我的问题非常类似于使用图像作为绘图点的现有问题,尽管我对轴标签而不是绘图点更感兴趣.但是,我很好奇两个任务的相似程度,以及是否可以为此目的调整该解决方案.我无法自己解决这个问题.
这是我的第一篇文章,所以我不允许发布图像,但是这段代码实现了我想要的东西.注意:这种方法使用了一种丑陋,丑陋的黑客,它不便携,而且不尽如人意.我想要生成的最终绘图将具有facets(facet_grid
),并且x轴用于在每个轴刻度处具有不同图片的因子,而不是连续变量,这就是为什么我正在寻找更一般/更强大的解决方案不需要大量的试验和错误.
library(ggplot2)
## library(grImport) # not needed for this example, but would be for grid.symbols()
p <- ggplot(mtcars, aes(cyl, mpg)) + stat_summary(fun.data = "mean_cl_boot")
print(p)
## Replace (in this case, overlay) x-axis tick labels with a graphic / grob
iconSize <- 0.05
iconHt <- 0.2
padding <- 0.09 # horizontal …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将数据表添加到ggplot中创建的图形中(类似于excel功能,但可以灵活地将轴更改为on)
我已经做了一些事情,并继续遇到缩放的问题所以尝试1)
library(grid)
library(gridExtra)
library(ggplot2)
xta=data.frame(f=rnorm(37,mean=400,sd=50))
xta$n=0
for(i in 1:37){xta$n[i]<-paste(sample(letters,4),collapse='')}
xta$c=0
for(i in 1:37){xta$c[i]<-sample((1:6),1)}
rect=data.frame(xmi=seq(0.5,36.5,1),xma=seq(1.5,37.5,1),ymi=0,yma=10)
xta=cbind(xta,rect)
a = ggplot(data=xta,aes(x=n,y=f,fill=c)) + geom_bar(stat='identity')
b = ggplot(data=xta,aes(x=n,y=5,label=round(f,1))) + geom_text(size=4) + geom_rect(aes(xmin=xmi,xmax=xma,ymin=ymi,ymax=yma),alpha=0,color='black')
z = theme(axis.text=element_blank(),panel.background=element_rect(fill='white'),axis.ticks=element_blank(),axis.title=element_blank())
b=b+z
la=grid.layout(nrow=2,ncol=1,heights=c(0.15,2),default.units=c('null','null'))
grid.show.layout(la)
grid.newpage()
pushViewport(viewport(layout=la))
print(a,vp=viewport(layout.pos.row=2,layout.pos.col=1))
print(b,vp=viewport(layout.pos.row=1,layout.pos.col=1))
Run Code Online (Sandbox Code Playgroud)
哪个产生了
第二次尝试2)
xta1=data.frame(t(round(xta$f,1)))
xtb=tableGrob(xta1,show.rownames=F,show.colnames=F,show.vlines=T,gpar.corefill=gpar(fill='white',col='black'),gp=gpar(fontsize=12),vp=viewport(layout.pos.row=1,layout.pos.col=1))
grid.newpage()
la=grid.layout(nrow=2,ncol=1,heights=c(0.15,2),default.units=c('null','null'))
grid.show.layout(la)
grid.newpage()
pushViewport(viewport(layout=la))
print(a,vp=viewport(layout.pos.row=2,layout.pos.col=1))
grid.draw(xtb)
Run Code Online (Sandbox Code Playgroud)
哪个产生了
最后3)是
grid.newpage()
print(a + annotation_custom(grob=xtb,xmin=0,xmax=37,ymin=450,ymax=460))
Run Code Online (Sandbox Code Playgroud)
哪个产生了
其中选项2将是最好的,如果我可以将tableGrob缩放到与绘图相同的大小,但我不知道如何做到这一点.关于如何进一步采取行动的任何指示?- 谢谢
我在同一页面上有两个ggplots,我希望它们的面板宽度相同.
一些样本数据:
dfr1 <- data.frame(
time = 1:10,
value = runif(10)
)
dfr2 <- data.frame(
time = 1:10,
value = runif(10, 1000, 1001)
)
Run Code Online (Sandbox Code Playgroud)
一个低于另一个的情节:
p1 <- ggplot(dfr1, aes(time, value)) + geom_line()
p2 <- ggplot(dfr2, aes(time, value)) + geom_line()
grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 1)))
print(p1, vp = viewport(layout.pos.row = 1, layout.pos.col = 1))
print(p2, vp = viewport(layout.pos.row = 2, layout.pos.col = 1))
Run Code Online (Sandbox Code Playgroud)
如何指定每个图中的面板宽度和位置,以使它们对齐?
(我不想将图表与刻面结合起来;这在我的实际例子中是不合适的.)
我有6个图,我想以两步的方式整齐地排列(见图).最好,我想添加漂亮的箭头.
有任何想法吗?
UPD.当我的问题开始收集负面反馈时,我想澄清一下,我已经检查了所有(部分)相关的问题,并没有发现如何在"画布"上自由定位ggplots.而且,我想不出在绘图之间绘制箭头的单一方法.我不是要求现成的解决方案.请指出方向.
我想用文件名注释我的情节.随plot()
我用过mtext
:
plot(1:10)
mtext("File xy-12-34-56.csv", 4)
Run Code Online (Sandbox Code Playgroud)
我怎么能用ggplot2和qplot或ggplot来做到这一点?它不应该与传说相撞.我发现的命令annotate
和grid
,但我不能让类似的注释mtext
与这些.
作为一种解决方法,我可以尝试水印,但也许你对我有一个很好的暗示.亲切的问候,乔纳斯
我有两个图(使用基本图形创建)和2个数据框,我想将它们组合到PDF中的一个工作表上.我正在使用grid.table从我的数据框创建一个tableGrobs.我在格式化PDF输出时遇到了很多困难.特别是,我没有成功将所有对象保存在同一页面上.我希望右侧面板包含一个图形,左侧面板包含另一个图形,下面有2个表格(横向格式).
目前我的代码如下:
library('gridExtra')
pdf("Rplots.pdf", paper = "USr", height = 8.5, width = 11)
layout(matrix(c(1,3, 2,3, 4,3), nrow = 3, ncol = 2, byrow = TRUE))
plot(myPlot1)
grid.table(df1)
plot(myPlot2)
grid.table(df2)
dev.off()
Run Code Online (Sandbox Code Playgroud)
我不希望使用GGPLOT2.
我也发现了类似的答案像这样的问题,但大部分都是使用包rworldmap
,ggmap
,ggsubplot
或geom_subplot2d
.例如,在此处或此处查看.
我想知道如何将其他ggplot对象(如条形图)绘制到地图上,这是从shapefile创建的.我正在使用的那个可以在这里下载.
编辑
正如@beetroot正确指出的那样,可以在上面发布的链接下下载的新文件发生了显着变化.因此,调整shapefile等的名称.
library(rgdal)
library(ggplot2)
library(rgeos)
library(maptools)
map.det<- readOGR(dsn="<path to your directory>/swissBOUNDARIES3D100216/swissBOUNDARIES3D/V200/SHAPEFILE_LV03", layer="VECTOR200_KANTONSGEBIET")
map.kt <- map.det[map.det@data$KANTONSNUM=="CH01000000"|map.det@data$KANTONSNUM=="CH19000000",]
#get centroids
map.test.centroids <- gCentroid(map.kt, byid=T)
map.test.centroids <- as.data.frame(map.test.centroids)
map.test.centroids$KANTONSNR <- row.names(map.test.centroids)
#create df for ggplot
kt_geom <- fortify(map.kt, region="KANTONSNUM")
#Plot map
map.test <- ggplot(NULL)+
geom_polygon(data=kt_geom, aes(long, lat, group=group), fill="white")+
coord_fixed()+
geom_path(data=kt_geom, color="gray48", mapping=aes(long, lat, group=group), size=0.2)+
geom_point(data=map.test.centroids, aes(x=x, y=y), size=9, alpha=6/10)
mapp
Run Code Online (Sandbox Code Playgroud)
但是,我在组合两个地图时遇到了困难map.test
,例如地图,例如,这个:
geo_data <- …
Run Code Online (Sandbox Code Playgroud) 当传奇标题很长时,我很难将传奇中心的标题相对于图例键对齐.一年前有一个问题适用于短标题,但它似乎不适用于长标题.
示例,首先使用简短的图例标题:
library(ggplot2)
ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Petal.Width)) + geom_point(size = 3) +
scale_color_distiller(palette = "YlGn", type = "seq", direction = -1,
name = "A") +
theme(legend.title.align = 0.5)
Run Code Online (Sandbox Code Playgroud)
一切都如预期的那样,图例标题位于图例键的上方.
现在和一个长长的传奇标题相同:
ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Petal.Width)) + geom_point(size = 3) +
scale_color_distiller(palette = "YlGn", type = "seq", direction = -1,
name = "Long legend heading\nShould be centered") +
theme(legend.title.align = 0.5)
Run Code Online (Sandbox Code Playgroud)
我们可以看到文本中心与自身对齐,但与图例键无关.我已经尝试修改其他主题选项,例如legend.justification = "center"
,但似乎没有人从图例框中最左侧的位置移动键.
几条评论:
我几天前正在运行ggplot2的开发版本,v2.2.1.9000.
我特别需要一个连续色阶调色板的解决方案.
当尺寸不同时,我一直试图在 ggplot2 或网格中绘制线段之间具有相等间距的线。但是我没有成功,所以我向你寻求帮助。
在下面的示例中,如何在线条大小不同的情况下保持线段之间的绝对间距相等?
我想避免使用自定义makeContent.myclass
方法来控制自己。
library(ggplot2)
library(grid)
df <- data.frame(
x = c(1:2, 1:2),
y = c(1:2, 2:1),
size = c(1,1,10,10)
)
# In ggplot2
ggplot(df, aes(x, y, size = size, group = size)) +
geom_line(linetype = 2)
Run Code Online (Sandbox Code Playgroud)
# In grid
lines <- polylineGrob(
x = scales::rescale(df$x),
y = scales::rescale(df$y),
id = c(1,1,2,2),
gp = gpar(lty = 2, lwd = c(1, 10))
)
grid.newpage(); grid.draw(lines)
Run Code Online (Sandbox Code Playgroud)
我想要类似于以下在 illustrator 中制作的东西。请注意,红线段的长度相等。
有任何想法吗?谢谢阅读!