2014-09-02 14 views
7

Tôi muốn vẽ một nhãn trên một dòng trong đồ họa đơn sắc. Vì vậy, tôi cần biên giới nhỏ màu trắng trên mỗi chữ cái của nhãn.R: Có cách nào để đặt đường viền, bóng hoặc vùng đệm xung quanh các nhãn văn bản trên các ô R?

Đường viền hoặc nền của hình chữ nhật của nhãn văn bản không hữu ích vì ẩn nhiều dữ liệu được vẽ.

Có cách nào để đặt đường viền, bóng tối hoặc vùng đệm quanh nhãn văn bản trên ô R không?

EDIT:

shadowtext <- function(x, y=NULL, labels, col='white', bg='black', 
        theta= seq(pi/4, 2*pi, length.out=8), r=0.1, ...) { 

    xy <- xy.coords(x,y) 
    xo <- r*strwidth('x') 
    yo <- r*strheight('x') 

    for (i in theta) { 
    text(xy$x + cos(i)*xo, xy$y + sin(i)*yo, labels, col=bg, ...) 
    } 
    text(xy$x, xy$y, labels, col=col, ...) 
} 

pdf(file="test.pdf", width=2, height=2); par(mar=c(0,0,0,0)+.1) 
    plot(c(0,1), c(0,1), type="l", lwd=20, axes=FALSE, xlab="", ylab="") 
    text(1/6, 1/6, "Test 1") 
    text(2/6, 2/6, "Test 2", col="white") 
    shadowtext(3/6, 3/6, "Test 3") 
    shadowtext(4/6, 4/6, "Test 4", col="black", bg="white") 
    shadowtext(5/6, 5/6, "Test 5", col="black", bg="white", theta = seq(pi/4, 2*pi, length.out=24)) 
dev.off() 

Đoạn mã trên sử dụng các giải pháp từ koekenbakker. Điều này là tốt cho đồ họa PNG.

Tôi cần một cách tiếp cận khác nhau đối với độ phân giải cao o vector PDF như thế này https://docs.google.com/file/d/0BwpJogoN4kzHUEkwMEI2Rzg2T0k/edit?pli=1

+1

Có rất nhiều chức năng âm mưu khác nhau và hệ thống đồ họa trong R. Hãy chắc nhiều cụ thể hơn về chính xác những gì các lệnh vẽ bạn đang sử dụng. Thậm chí tốt hơn, bao gồm một [ví dụ tái sản xuất] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – MrFlick

+0

Sự cố với pdf là gì? Bạn có nghĩa là độ phân giải? Bạn có thể điều chỉnh thông số theta để có độ phân giải cao hơn. Tôi sẽ thay đổi điều này trong câu trả lời của tôi. – koekenbakker

+0

bạn nói đúng. Trong ví dụ của tôi, tôi đã thử một theta 24 item và không đủ. Nhưng trong ví dụ của bạn hoạt động hoàn hảo với 50. Cảm ơn – fnd

Trả lời

13

Bạn có thể thử chức năng này 'SHADOWTEXT' vẽ hình một quầng hoặc đường viền xung quanh văn bản bằng cách in nó nhiều lần với một chút bù đắp trong một màu sắc khác nhau. Tất cả tín dụng cho Greg Snow here.

shadowtext <- function(x, y=NULL, labels, col='white', bg='black', 
         theta= seq(0, 2*pi, length.out=50), r=0.1, ...) { 

    xy <- xy.coords(x,y) 
    xo <- r*strwidth('A') 
    yo <- r*strheight('A') 

    # draw background text with small shift in x and y in background colour 
    for (i in theta) { 
     text(xy$x + cos(i)*xo, xy$y + sin(i)*yo, labels, col=bg, ...) 
    } 
    # draw actual text in exact xy position in foreground colour 
    text(xy$x, xy$y, labels, col=col, ...) 
} 

# And here is an example of use: 
# pdf(file="test2.pdf", width=2, height=2); par(mar=c(0,0,0,0)+.1) 
plot(c(0,1), c(0,1), type="n", lwd=20, axes=FALSE, xlab="", ylab="") 

rect(xleft = 0.5, xright = 1, ybottom = 0, ytop = 1, col=1) 
text(1/6, 1/6, "Test 1") 
shadowtext(2/6, 2/6, "Test 2", col='red', bg="blue") 
shadowtext(3/6, 3/6, "Test 3", cex=2) 

# `r` controls the width of the border 
shadowtext(5/6, 5/6, "Test 4", col="black", bg="white", cex=4, r=0.2) 
# dev.off() 

enter image description here

1

Tôi đã viết một chức năng tương tự cho các lĩnh vực văn bản, mà cũng hoạt động trên quy mô logarit.

install.packages("berryFunctions") 
library("berryFunctions") 
?textField 

Điều này có thể được coi là đẹp hơn cho đồ họa véc tơ. Dưới đây là một số ví dụ:

enter image description here

PS: Nếu bạn muốn đóng góp: https://github.com/brry/berryFunctions

1

Đây là nỗ lực của tôi thêm một bộ đệm văn bản khi ghi nhãn đường viền (hoặc vòng tròn trong ví dụ này). Nó chắc chắn không hiệu quả hay đẹp như giải pháp của koekenbakker nhưng nó phục vụ mục đích của nó cho tôi để cô lập các nhãn văn bản từ dòng.

require(shape) 
plot(250,250, xlim=c(0,500), ylim=c(0,500), axes=F, ylab="", xlab="", col="black") ## set up the plotting area 

circle_radius<-c(200, 150, 50) ## we wan't to draw a few circles which we will label after using our buffer 

for (i in 1:length(circle_radius)){ 
    plotcircle(mid=c(250,250), r=circle_radius[i], lwd=0.5,lcol="grey40") ## iteratively plot the circles 

text_buffer<-seq(0.1, 0.7, by=0.01) ## this is the key to the text buffer. Create a vector of values to set the character size (cex) during the following loop 

for(j in text_buffer){ 
    text(x=250+circle_radius[i], 250, print(paste(circle_radius[i],"m")), cex=j, srt=270, col="white") ## write the text buffer in white starting from the smallest value of cex to the largest 
} ## end of loop for writing buffer 
    text(x=250+circle_radius[i], 250, print(paste(circle_radius[i],"m")), cex=0.5, srt=270) ## write over the buffer with black text 

} ## end of loop for drawing circles 

Plot of circles with text buffers

7

tôi cần phải làm điều này cho một bản đồ trong R và kết thúc bằng cách sử dụng "raster" gói để vẽ hào quang xung quanh nhãn văn bản.

http://rpackages.ianhowson.com/cran/raster/man/text.html

ví dụ

text(Points, labels = Points$Labels, halo = TRUE, hw = 0.08, hc = "white", cex = 0.8) 
# hw = halo width 
# hc = halo color 

enter image description here

+0

Đây là câu trả lời mà mọi người đang tìm kiếm. – Cyrille

Các vấn đề liên quan