2011-10-12 76 views
7

Tôi đang tìm cách kiểm soát độ dày của văn bản được vẽ trong R mà không có kích thước của các ký tự thay đổi. Dưới đây là một ví dụ (không sử dụng R):Điều chỉnh độ dày phông chữ mà không thay đổi cỡ chữ

varying font weights

Từ giữa có bề dày hai lần đầu, tuy nhiên kích thước đều giống nhau (vì vậy không mở rộng quy mô xảy ra). Từ dưới cùng thực sự là hai từ: một từ màu đỏ nằm trên một từ trắng nặng, để tạo ra sự tách màu (đặc biệt hữu ích cho việc chú thích một âm mưu bận).

Dưới đây là một tập hợp các lệnh tôi đã ném với nhau để cố gắng và sao chép hình trên:

png("font.png",width=1.02, height=1.02, units="in", res=150) 
par(ps=10, font=1, bg="light gray", col="black", mai=rep(0.02,4), pin=c(1,1)) 
plot.new() 
box() 
text(0.5,0.85,"FONT",cex=1) 
text(0.5,0.6,"FONT",cex=2) 
text(0.5,0.3,"FONT",cex=2,col="white") 
text(0.5,0.3,"FONT",cex=1,col="red") 
text(0.5,0.1,"FONT",cex=1, font=2, col="white") 
text(0.5,0.1,"FONT",cex=1, font=1, col="red") 
dev.off() 

cho:

replicating in R

Vì vậy, hiệu quả là giống như thay đổi font-face để in đậm, nhưng sự khác biệt về kích thước không đủ lớn để có thể nhận thấy khi chồng chéo. Trang trợ giúp par dường như không có cài đặt cụ thể cho việc này. Ai có ý tưởng gì không?

Lưu ý thay đổi size trong ggplot2 không tạo ra hiệu ứng tôi muốn, lần cuối cùng tôi đã chọn.

Trả lời

0

Bạn có thể thử:

text(...,"FONT", vfont = c('serif','bold')) 

Mặc dù tôi không chắc chắn làm thế nào bạn sẽ làm phiên bản thứ ba của FONT.

9

Bạn có thể thử thêm nhiều phiên bản của văn bản hơi chuyển trong một mô hình tròn,

yeah


library(grid) 
stextGrob <- function (label, r=0.02, x = unit(0.5, "npc"), y = unit(0.5, "npc"), 
         just = "centre", hjust = NULL, vjust = NULL, rot = 0, check.overlap = FALSE, 
         default.units = "npc", name = NULL, gp = gpar(), vp = NULL){ 

    let <- textGrob("a", gp=gp, vp=vp) 
    wlet <- grobWidth(let) 
    hlet <- grobHeight(let) 

    tg <- textGrob(label=label, x=x, y=y, gp=gpar(col="red"), 
        just = just, hjust = hjust, vjust = vjust, rot = rot, 
        check.overlap = check.overlap, 
        default.units = default.units) 

    tgl <- c(lapply(seq(0, 2*pi, length=36), function(theta){ 

    textGrob(label=label,x=x+cos(theta)*r*wlet, 
       y=y+sin(theta)*r*hlet, gp=gpar(col="white"), 
       just = just, hjust = hjust, vjust = vjust, rot = rot, 
       check.overlap = check.overlap, 
       default.units = default.units) 

    }), list(tg)) 


    g <- gTree(children=do.call(gList, tgl), vp=vp, name=name, gp=gp) 

} 

grid.stext <- function(...){ 
    g <- stextGrob(...) 
    grid.draw(g) 
    invisible(g) 
} 

grid.newpage() 
grid.rect(gp=gpar(fill="grey")) 
grid.stext("Yeah", gp=gpar(cex=4)) 

Có một phiên bản sử dụng đồ họa cơ sở ẩn nấp trong các tài liệu lưu trữ của R-giúp đỡ, từ đó điều này được truyền cảm hứng.

+0

Wow. Hoặc tôi nên nói "Yeah!"? – joran

+0

đẹp ,,, nhưng tôi không khuyên bạn nên cách này nếu bạn sử dụng đồ họa vector. Đối với đồ họa raster, nó thực sự rất đẹp. – kohske

+0

Cảm ơn, nhưng thực ra nó phải là "F ** k yeah!". Có vẻ kỳ lạ là giải pháp này đòi hỏi quá nhiều mã bổ sung? Nói cách khác, tôi đã ngạc nhiên không có thiết lập đồ họa để làm điều này. –

3

Một tùy chọn sử dụng một tập tin postscript tạm thời, chuyển đổi sang một hình dạng bằng cách grImport,

enter image description here

library(grImport) 

cat("%!PS 
    /Times-Roman findfont 
    100 scalefont 
    setfont 
    newpath 
    0 0 moveto 
    (hello) show", file="hello.ps") 

PostScriptTrace("hello.ps", "hello.xml") 
hello <- readPicture("hello.xml") 
grid.rect(gp=gpar(fill="grey")) 
grid.picture(hello,use.gc = FALSE, gp=gpar(fill="red", lwd=8, col="white")) 

Tôi tưởng tượng một cái gì đó tương tự có thể được thực hiện với một file đồ họa raster tạm thời, mờ bởi một số xử lý ảnh thuật toán và hiển thị dưới dạng raster bên dưới văn bản.

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