Chỉnh sửa nhãn chú giải (văn bản) trong ggplot


120

Tôi đã dành hàng giờ để xem tài liệu và trên StackOverflow, nhưng dường như không có giải pháp nào giải quyết được vấn đề của tôi. Khi sử dụng, ggplottôi không thể lấy đúng văn bản trong chú giải, mặc dù nó nằm trong khung dữ liệu của tôi. Tôi đã thử scale_colour_manual, scale_fill_manualvới các giá trị khác nhau, labels=chẳng hạn nhưc("T999", "T888")", "cols" .

Đây là mã của tôi:

T999 <- runif(10, 100, 200)
T888 <- runif(10, 200, 300)
TY <- runif(10, 20, 30)
df <- data.frame(T999, T888, TY)


ggplot(data = df, aes(x=T999, y=TY, pointtype="T999")) + 
       geom_point(size = 15, colour = "darkblue") + 
       geom_point(data = df, aes(x=T888, y=TY), colour = 'red', size = 10 ) + 
       theme(axis.text.x = element_text(size = 20), axis.title.x =element_text(size = 20),   axis.text.y = element_text(size = 20)) +
       xlab("Txxx") + ylab("TY [°C]") + labs(title="temperatures", size = 15) + 
       scale_colour_manual(labels = c("T999", "T888"), values = c("darkblue", "red")) +    theme(legend.position="topright")

Giúp đỡ sẽ rất được đánh giá cao!


8
Hãy xem hướng dẫn này để tìm ra định dạng dữ liệu nào ggplothài lòng nhất (dài, không rộng) và để có cảm giác về sự khác biệt giữa ánh xạ một aescâu thần chú với một biến trong lệnh aesgọi so với đặt nó bên ngoài aes. Bạn cần chuyển meltdữ liệu của mình sang định dạng dài và ánh xạ colour(hoặc fill) vào aesbiến có liên quan.
Henrik

Câu trả lời:


146

Hướng dẫn mà @Henrik đã đề cập là một nguồn tài nguyên tuyệt vời để học cách tạo các lô với ggplot2gói.

Một ví dụ với dữ liệu của bạn:

# transforming the data from wide to long
library(reshape2)
dfm <- melt(df, id = "TY")

# creating a scatterplot
ggplot(data = dfm, aes(x = TY, y = value, color = variable)) + 
  geom_point(size=5) +
  labs(title = "Temperatures\n", x = "TY [°C]", y = "Txxx", color = "Legend Title\n") +
  scale_color_manual(labels = c("T999", "T888"), values = c("blue", "red")) +
  theme_bw() +
  theme(axis.text.x = element_text(size = 14), axis.title.x = element_text(size = 16),
        axis.text.y = element_text(size = 14), axis.title.y = element_text(size = 16),
        plot.title = element_text(size = 20, face = "bold", color = "darkgreen"))

kết quả này trong:

nhập mô tả hình ảnh ở đây

Như đã đề cập bởi @ user2739472 trong nhận xét: Nếu bạn chỉ muốn thay đổi nhãn văn bản chú giải chứ không phải màu từ bảng mặc định của ggplot, bạn có thể sử dụng scale_color_hue(labels = c("T999", "T888"))thay thế scale_color_manual().


@Sathish Như bạn có thể thấy, tiêu đề của trục y nhỏ hơn tiêu đề trong trục x. Các kích thước khác nhau được sử dụng để minh họa các khả năng và hệ quả của nó. Vì vậy, mã được sử dụng trong câu trả lời là imo chính xác.
Jaap

@Sathish Thêm vào nhận xét trước đây của tôi: đó chắc chắn là một lựa chọn để làm theo cách đó! Tất cả phụ thuộc vào những gì bạn muốn đạt được ;-)
Jaap

9
Nếu bạn chỉ muốn thay đổi các nhãn văn bản huyền thoại và không phải là màu sắc từ bảng màu mặc định ggplot, bạn có thể sử dụng scale_color_hue(labels = c("T999", "T888"))thay vìscale_color_manual()
user2739472

1
@ user2739472 Thx & true. Sẽ thêm nó vào câu trả lời của tôi.
Jaap

@Sathish Tôi hơi trễ, nhưng đã sửa lỗi chính tả ngay bây giờ :-)
Jaap

41

Các tiêu đề chú giải có thể được gắn nhãn theo thẩm mỹ cụ thể .

Điều này có thể đạt được bằng cách sử dụng guides()hoặc các labs()chức năng từ ggplot2(thêm tại đâytại đây ). Nó cho phép bạn thêm các thuộc tính hướng dẫn / chú giải bằng cách sử dụng ánh xạ thẩm mỹ.

Đây là một ví dụ sử dụng tập mtcarsdữ liệu và labs():

ggplot(mtcars, aes(x=mpg, y=disp, size=hp, col=as.factor(cyl), shape=as.factor(gear))) +
  geom_point() +
  labs(x="miles per gallon", y="displacement", size="horsepower", 
       col="# of cylinders", shape="# of gears")

nhập mô tả hình ảnh ở đây

Trả lời câu hỏi của OP bằng cách sử dụng guides():

# transforming the data from wide to long
require(reshape2)
dfm <- melt(df, id="TY")

# creating a scatterplot
ggplot(data = dfm, aes(x=TY, y=value, color=variable)) + 
  geom_point(size=5) +
  labs(title="Temperatures\n", x="TY [°C]", y="Txxx") +
  scale_color_manual(labels = c("T999", "T888"), values = c("blue", "red")) +
  theme_bw() +
  guides(color=guide_legend("my title"))  # add guide properties by aesthetic

nhập mô tả hình ảnh ở đây


Tôi không đồng ý về điều đó. Khi chỉ xác định tiêu đề, việc chỉ định tiêu đề trong đối số scale_ ..hoặc labsđối số sẽ dễ dàng hơn .
Jaap,

Tôi đã nhận xét về giải pháp của bạn từ 15 phút trước đã thêm tiêu đề vào scale_color_manual(title="...", ...). Tôi thấy bạn đã sửa đổi nó để tham khảo màu sắc thẩm mỹ trong labs(). Tôi đưa ra giải pháp của mình như một giải pháp thay thế.
Megatron,

Hiện tại, điều này dường như sẽ sửa đổi chú giải nếu nó là một gradient tô màu trở nên vô nghĩa hơn.
Max Candocia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.