[英]Plotly: How to convert ggplot object into plotly?
我有一個包含兩列的數據集。第一列名為 Centile.threshold,第二列是 Effective.tax.rates。 所以接下來的陡峭是使用下面的代碼制作 plot。
# Data and code
library("rJava")
library("xlsxjars")
library("xlsx")
require(tidyr)
require(plyr)
library("ggplot2")
library("plotly")
g4_data_ext<-data.frame(structure(list(Centile.threshold = c(1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100), Effective.tax.rates = c(11.4875111183361,
8.07673874931679, 7.8639563682086, 6.84656368538612, 6.8383437884744,
5.83532681932012, 5.11955857753708, 4.68757220539562, 4.66492423437793,
4.63051650494602, 4.71570390296145, 4.4419481131279, 4.16374366969064,
4.4424750798236, 4.2633646392858, 4.10185821346884, 2.29819561722,
2.01895390855722, 0, 0, 2.80530318111453, 2.83367683951859, 3.03173307975026,
3.58758933227946, 3.05869003045607, 3.59225918463074, 3.01588015121759,
3.55943967998446, 3.6220565232692, 3.40885422585891, 3.51447401518606,
3.68902868712004, 3.77018314638409, 3.72783452684771, 3.80791342516448,
3.99449874248864, 4.08421307782513, 4.07517557211112, 4.19659018929637,
4.22887420998102, 4.25529382081159, 4.36205679154288, 4.40690982734329,
4.33909305037396, 4.45990415426276, 4.59436808108174, 4.6831546716255,
4.73811656768519, 4.75412915916737, 4.84778797281815, 4.94690785473091,
5.06784298188807, 5.1769208879221, 5.2520552039406, 5.33650672817794,
5.43499638671921, 5.52400199193912, 5.58169115527766, 5.70509046165446,
5.76549758450655, 5.86333222670147, 5.87097687497217, 5.98729128544292,
6.07397530734785, 6.15030076581313, 6.21615540600908, 6.28135059352123,
6.38292345287997, 6.43416757218245, 6.5863284138631, 6.63365437304645,
6.70316768627345, 6.7816891944299, 6.85128738244695, 6.94261253911407,
7.01673024329712, 7.11081973369591, 7.18077796481166, 7.26197149513331,
7.32607460317916, 7.39638728837014, 7.47062968448649, 7.55194205005014,
7.64318101794584, 7.73728594723894, 7.79092205170689, 7.88152530983832,
7.97428540786095, 8.09278589483141, 8.20373396784042, 8.27757060469128,
8.40889176349213, 8.50851684368756, 8.64124701008068, 8.72559960562268,
8.85276486059087, 9.06564270204267, 9.26861906650096, 9.43047799204161,
10.2298639144453), grp_id = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
6, 6, 6, 7, 8), grp_label = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 2L, 3L), .Label = c("<=50%",
"=99%", ">99%", "51%-60%", "61%-70%", "71%-80%", "81%-90%", "91%-98%"
), class = "factor")), row.names = c(NA, -100L), class = "data.frame"))
這是用 ggplot 繪制 plot 的代碼。 這段代碼運行良好。
g4_data_ext<-data.frame(g4_data, grp_id=NA, grp_label=NA)
for (i in 1:length((g4_data$Centile.threshold)))
{
if (g4_data$Centile.threshold[i]<=50)
{
g4_data_ext$grp_label[i] <- "<=50%"
g4_data_ext$grp_id[i] <- 1
}
else if (51<=g4_data$Centile.threshold[i] & g4_data$Centile.threshold[i]<=60)
{
g4_data_ext$grp_label[i] <- "51%-60%"
g4_data_ext$grp_id[i] <- 2
}
else if (61<=g4_data$Centile.threshold[i] & g4_data$Centile.threshold[i]<=70)
{
g4_data_ext$grp_label[i] <- "61%-70%"
g4_data_ext$grp_id[i] <- 3
}
else if (71<=g4_data$Centile.threshold[i] & g4_data$Centile.threshold[i]<=80)
{
g4_data_ext$grp_label[i] <- "71%-80%"
g4_data_ext$grp_id[i] <- 4
}
else if (81<=g4_data$Centile.threshold[i] & g4_data$Centile.threshold[i]<=90)
{
g4_data_ext$grp_label[i] <- "81%-90%"
g4_data_ext$grp_id[i] <- 5
}
else if (90<=g4_data$Centile.threshold[i] & g4_data$Centile.threshold[i]<=98)
{
g4_data_ext$grp_label[i] <- "91%-98%"
g4_data_ext$grp_id[i] <- 6
}
else if (g4_data$Centile.threshold[i]==99)
{
g4_data_ext$grp_label[i] <- "=99%"
g4_data_ext$grp_id[i] <- 7
}
else
{
g4_data_ext$grp_label[i] <- ">99%"
g4_data_ext$grp_id[i] <- 8
}
}
g4_data_ext$grp_label<-factor(g4_data_ext$grp_label)
color_code<-factor(c(rep("dark turquoise", 6), "tomato", "orange red"))
means_g4<-data.frame(ddply(g4_data_ext,~grp_id+grp_label,summarise,mean=mean(Effective.tax.rates),sd=sd(Effective.tax.rates)), color_code)
ggplot(data = means_g4, aes(x=factor(grp_id),y=mean, label =mean ))+
scale_x_discrete("Group",breaks=c(1:8), labels=means_g4$grp_label)+
coord_cartesian(ylim = c(-3, 12)) +
geom_bar(stat="identity", fill=color_code)+
geom_text(aes(y = mean*1.1, label = round(mean,2)), position=position_dodge(0.9))+
theme(axis.text.x = element_text(angle = 0))
But my intention is to convert this plot with ggplotly().I tryed to convert but is work well, so can anybody help me how to convert this plot into plotly object?
當我嘗試
ggplotly(ggplot(data = means_g4, aes(x=factor(grp_id),y=mean, label =mean ))+
scale_x_discrete("Group",breaks=c(1:8), labels=means_g4$grp_label)+
coord_cartesian(ylim = c(-3, 12)) +
geom_bar(stat="identity", fill=color_code)+
geom_text(aes(y = mean*1.1, label = round(mean,2)), position=position_dodge(0.9))+
theme(axis.text.x = element_text(angle = 0)))
我得到錯誤
Error in nchar(axisObj$ticktext) : 'nchar()' requires a character vector
如果我scale_x_discrete
項,這個錯誤就會消失。 那里唯一看起來應該是字符向量的是labels=means_g4$grp_label
,實際上means_g4$grp_label
是一個因素。 所以轉換它, ggplotly()
工作:
ggplotly(ggplot(data = means_g4, aes(x=factor(grp_id),y=mean, label =mean ))+
scale_x_discrete("Group",breaks=c(1:8), labels=as.character(means_g4$grp_label))+
coord_cartesian(ylim = c(-3, 12)) +
geom_bar(stat="identity", fill=color_code)+
geom_text(aes(y = mean*1.1, label = round(mean,2)), position=position_dodge(0.9))+
theme(axis.text.x = element_text(angle = 0)))
這看起來像ggplotly()
中的一個錯誤,它應該自動進行轉換。
user2554330 弄清楚了您問題的難點。 rest 很簡單,因為我沒有看到您將 ggplot 轉換為 plotly 的實際嘗試,所以您可以這樣做:
從“標准” ggplot 方法中,只需包含ggplotly
:
p <- ggplot(...)
p <- p + geom_point(...) # just an example...
fig <- ggplotly(p)
fig
這是一個例子:
library(plotly)
library(tidyverse)
library(ggplot2)
# ggplot
p <- ggplot(data=iris, aes(x = Sepal.Length, y = Sepal.Width))
p <- p + geom_point(aes(color=Species, shape=Species)) +
xlab("Sepal Length") + ylab("Sepal Width") +
ggtitle("Sepal Length-Width")
# plotly
fig <- ggplotly(p)
fig
Plot:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.