ggplot2柱形图/条形图顺序调整

该博客介绍了如何使用ggplot2在R中调整柱形图的横坐标和图例顺序。首先,通过factor函数设置因子水平以改变图例顺序。然后,利用reorder函数根据其他列的值重新排序横坐标。示例代码展示了两种不同的排序方法,一种保持图例顺序不变,另一种依据Z列对X进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ggplot2柱形图/条形图顺序调整


要点

ggplot2条形图横坐标顺序以及图例顺序如何调整,先将横坐标因子化为图例中想要的顺序,然后使用在aes中使用reorder函数改变图中的横坐标顺序

代码

df%>%
	mutate(newx = factor(x,levels=c("d","b","c")))%>%
	ggplot(aes(x,y))+
	geom_bar()
# 此时图的横坐标和图例顺序是levels中的顺序

此时图的横坐标和图例顺序是levels中的顺序

df%>%
	mutate(newx = factor(x,levels=c("d","b","c")))%>%
	ggplot(aes(order(x,z),y))+
	geom_bar()
#此时图中的横坐标顺序为,以Z列大小对X进行排序的顺序,图例顺序依旧为levels中的顺序

此时图中的横坐标顺序为,以Z列大小对X进行排序的顺序,图例顺序依旧为levels中的顺序

<think>嗯,用户的问题是关于在R语言中使用colorRampPalette()函数来创建堆叠柱形图,每个柱子的颜色都是中间白色,两侧同色的渐变色。而且需要注意rice1和wheat1是负值。首先,我需要理解用户的具体需求,然后一步步思考如何实现。 首先,用户的数据结构已经转换成长格式data_long,这通常是为了方便ggplot2绘图,尤其是堆叠图。但堆叠柱形图默认是垂直堆叠,而用户可能希望每个柱子内部有不同的颜色渐变,中间白色,两侧同色。这里可能需要每个柱子内部有不同的颜色渐变,而不是整个图例的颜色分布。不过,用户特别提到“每个图例的柱子颜色都为中间白色两侧同色”,可能是指每个类别(如rice, rice1等)对应的柱子内部有渐变色,中间白,两侧同色。但通常堆叠柱形图的每个部分是一个单色块,所以这里可能需要用某种方式模拟渐变效果。 接下来,用户提到rice1和wheat1是负值,这可能影响堆叠的方向,因为负值会向下堆叠。但颜色方面可能需要特别处理,比如负值部分使用不同的颜色渐变?或者只是普通的颜色,但用户希望每个柱子(不管正负)内部有渐变。可能需要明确如何处理负值部分的颜色。 然后,关于colorRampPalette()函数,通常用于生成颜色梯度。用户希望每个柱子的颜色中间白,两侧同色,比如从深蓝到白再到深蓝,或者从深红到白再到深红。因此,可能需要为每个类别创建一个颜色梯度,中间是白色,两侧是相同的颜色。例如,对于rice,可能生成一个从蓝色到白色再到蓝色的渐变,而rice1可能因为是负值,可能需要不同的颜色,或者同样处理但颜色不同? 不过,用户的问题中提到“每个图例的柱子颜色都为中间白色两侧同色的渐变色”,可能是指每个图例(即每个Type,如rice、rice1等)对应的柱子部分使用中间白两侧同色的颜色。例如,rice对应的部分在堆叠柱中是中间白,两侧蓝色;而rice1可能因为是负值,使用红色,中间白,两侧红色。但通常,堆叠柱形图的每个部分的颜色是固定的,而不是渐变的。所以这里可能需要使用渐变填充每个柱子的一部分,这可能需要使用geom_bar的fill参数,但如何实现每个部分的渐变呢? 这里可能需要更仔细的思考。通常,ggplot2的geom_bar不支持每个条形内部渐变,除非使用其他方法,比如将每个条形分割成多个小矩形,颜色逐渐变化。这可能比较复杂。或者,用户可能误解了问题,其实希望每个类别(Type)的颜色是从某个颜色到白色再到该颜色的渐变,但作为单色,取中间色?或者每个Type对应的颜色是双色渐变,中间是白色,两侧同色,但如何应用到堆叠条上? 可能用户希望每个堆叠的部分(如rice, rice1等)在各自的条柱中显示为渐变色,中间白,两侧同色。例如,对于每个Type的每个条柱部分,颜色从中间向上下两端渐变。但这在ggplot2中并不直接支持,可能需要每个堆叠部分被分解为多个小段,每个小段填充不同的颜色。 或者,用户可能希望每个柱子(每个年份的柱子)整体呈现中间白色,两侧同色的渐变,但这里每个柱子由多个部分堆叠而成,可能每个部分的颜色需要调整,使得整个柱子看起来中间白,两侧同色。但这样的话,可能需要每个堆叠部分的颜色在整体柱子中的位置来决定颜色,这可能更复杂。 现在回到用户提供的代码,数据转换成长格式,然后使用ggplot2绘制堆叠柱形图。用户希望每个堆叠的部分(Type)的颜色是中间白色,两侧同色,例如rice可能用蓝色渐变,rice1用红色渐变(因为负值?),而wheat和wheat1同理。 可能的解决方案是为每个Type生成一个颜色梯度,然后映射到每个堆叠的部分。但如何将渐变色应用到每个部分呢?因为每个堆叠部分是一个矩形,通常只能用单一颜色填充。所以可能需要使用线性渐变,但这在ggplot2中可能需要借助其他包,如ggpattern或手动创建渐变。 另一种思路是,用户可能希望每个Type对应的颜色是中间白色,两侧同色的单色,比如浅色到白色到浅色,但实际上可能只是选择一个中间色调的单一颜色。但用户明确提到渐变色,所以可能需要更复杂的处理。 或者,用户可能希望每个堆叠部分的颜色根据其在柱子中的位置(比如高度)而变化,中间位置是白色,上下两端是同一种颜色。例如,在rice的部分,顶部和底部是蓝色,中间是白色渐变。这可能需要将每个堆叠块分成多个小块,每个小块的颜色逐渐变化。 但这样的实现可能非常复杂,需要将每个堆叠部分分解为多个小矩形,每个小矩形的颜色根据位置渐变。这可能超出常规的ggplot2用法,需要自定义函数或使用其他包。 另外,用户提到使用colorRampPalette()函数,这个函数通常用于生成颜色向量,例如从两种颜色之间生成过渡色。例如,colorRampPalette(c("blue", "white", "blue"))(n)会生成从蓝到白再到蓝的n个颜色。如果每个堆叠部分需要这样的渐变,可能需要为每个Type生成一个颜色梯度,并根据堆叠的高度来分配颜色数量。 但如何应用到堆叠柱形图中呢?可能需要将每个堆叠块分割为多个小部分,每个小部分填充对应的渐变色。例如,如果某个Type的值为5,则将其分成5个小块,每个小块颜色从蓝到白到蓝。但这在数据较大时可能不实际,且代码复杂。 或者,用户可能误解了需求,其实希望每个Type对应的颜色是一个从中间白色到两侧同色的渐变,但作为单色,例如中间色调的单一颜色。但这样无法实现渐变效果。 现在,考虑到用户提供的示例数据中有rice1和wheat1为负值,可能需要区分正负值的颜色,例如正值为蓝色渐变,负值为红色渐变,中间白色。例如,rice和wheat使用蓝-白-蓝,而rice1和wheat1使用红-白-红的渐变。 但如何实现每个堆叠部分的颜色渐变呢?可能需要使用geom_tile或geom_rect来手动绘制每个渐变色块。例如,将每个堆叠部分分解为多个小矩形,每个小矩形的颜色根据位置变化。 这可能是一个可行的方法,但需要大量的数据处理和绘图代码。例如,对于每个堆叠块,计算其位置,并生成多个小矩形,每个分配对应的颜色。 具体步骤可能包括: 1. 对每个堆叠部分(如每个year的每个Type)生成一个高度分解,比如分成100个小块,每个小块的位置对应颜色渐变中的一个颜色。 2. 为每个Type生成对应的颜色渐变,例如rice使用蓝-白-蓝,rice1使用红-白-红。 3. 将这些颜色应用到分解后的小块上,使用geom_rect绘制。 这需要将原始数据转换为更细粒度的数据框,每个堆叠部分被分解为多个行,每个行代表一个小块,并带有对应的颜色。 这样的代码可能比较复杂,但可以实现所需的渐变效果。 另外,可能需要考虑堆叠的顺序,确保正负值正确堆叠,并且颜色正确应用。 现在,回到用户的问题,需要给出完整的R代码,并注释。因此,我需要构思如何实现这一点,可能使用上述分解方法。 首先,生成颜色渐变函数,针对每个Type: 例如: 对于rice和wheat(正值),使用蓝-白-蓝的渐变; 对于rice1和wheat1(负值),使用红-白-红的渐变。 然后,将每个堆叠块分解为多个小段,每个小段对应一个颜色。 例如,将每个Value分解为n个等分的小块,每个小块的高度为Value/n,颜色根据位置在渐变中选取。 然后,使用geom_rect绘制每个小块,颜色由渐变决定。 但如何实现这一点呢?可能需要使用dplyr的group_by和操作,为每个堆叠块生成多个行。 例如,将每个原始行扩展为n行,每个行对应一个小块的位置,并计算其对应的颜色。 接下来,编写这样的代码: 1. 定义颜色梯度函数: 对于正Type(rice, wheat): color_func_pos <- colorRampPalette(c("blue", "white", "blue")) 对于负Type(rice1, wheat1): color_func_neg <- colorRampPalette(c("red", "white", "red")) 然后,为每个Type的值分解为多个小块,比如n=100,每个小块的高度为Value/n,y的位置从start到 end,每个小块的颜色根据位置在渐变中选取。 例如,对于正值的Type,每个小块的颜色是color_func_pos(n)[i],其中i从1到n。 对于负值的Type,使用color_func_neg。 但需要确定每个Type的正负,但根据用户的数据,rice1和wheat1是负值,所以可能直接根据Type名称判断。 然后,代码的大致步骤如下: - 对data_long进行处理,确定每个Type是否为负值类别(rice1和wheat1)。 - 对每个观测(每个year和Type),分解Value为n个小块,记录每个小块的位置和颜色。 - 合并所有小块的数据,生成新的数据框。 - 使用ggplot2的geom_rect绘制每个小块,颜色对应渐变。 具体实现可能如下: 首先,确定每个Type的颜色函数: data_long <- data_long %>% mutate(color_type = case_when( Type %in% c("rice1", "wheat1") ~ "negative", TRUE ~ "positive" )) 然后,定义颜色函数: color_pos <- colorRampPalette(c("#2166AC", "white", "#2166AC")) # 蓝色系 color_neg <- colorRampPalette(c("#B2182B", "white", "#B2182B")) # 红色系 选择颜色时,可能需要更柔和的颜色,比如从深蓝到白再到深蓝,深红到白再到深红。 接下来,设定分解的细分数n,例如n=100: n <- 100 然后,对每个原始行进行分解: data_gradient <- data_long %>% group_by(years, Type) %>% reframe( segment = seq_len(n), y_start = (segment - 1) * Value / n, y_end = segment * Value / n, color = if (first(color_type) == "positive") { color_pos(n)[segment] } else { color_neg(n)[segment] } ) %>% ungroup() 但这里可能有问题,因为当Value为负时,y_start和y_end的计算需要调整,因为负值的高度是负的。例如,如果Value是-5,分解为100段,每个段的高度是-0.05,因此y_end = (segment) * (-5)/100,这可能需要注意堆叠的方向。 此外,在堆叠柱形图中,每个Type的堆叠位置由前面的Type的累积和决定。因此,在分解之前,需要计算每个Type在每个year中的位置,即y的起始和结束位置。 但之前的代码可能没有处理堆叠的位置,只是分解了每个Type的高度。正确的做法应该是,先计算每个Type在堆叠中的位置,然后再分解每个位置区间内的颜色渐变。 因此,可能需要先计算每个Type的累积高度,以确定每个堆叠块的起始和结束位置。 例如,在堆叠柱形图中,每个year的柱子由各个Type的Value堆叠而成。对于正负值,堆叠的方向不同:正值向上堆叠,负值向下堆叠。不过,在ggplot2中,堆叠是自动处理的,但需要确保数据中的正负值正确。 不过,当使用position="stack"时,正值会向上堆叠,负值向下堆叠。因此,每个Type的y位置由其前面所有Type的累积和决定。 因此,需要先对data_long进行排序,并计算每个year中各个Type的累积高度,以确定每个堆叠块的起始和结束位置。 例如: data_long <- data_long %>% group_by(years) %>% arrange(desc(Type)) %>% # 可能需要根据堆叠顺序排序 mutate( y_end = cumsum(Value), y_start = lag(y_end, default = 0) ) %>% ungroup() 但这里可能需要正确的堆叠顺序,比如先堆叠rice,再rice1,然后wheat,wheat1,或者其他顺序。这取决于用户的数据和需求。例如,可能希望正值的部分在上,负值的在下,或者相反。 不过,这可能比较复杂。假设用户的数据中,每个year的堆叠顺序是按照Type的顺序:rice, rice1, wheat, wheat1。或者可能需要根据实际数据调整顺序。 无论如何,要正确计算每个堆叠块的起始和结束位置,才能正确绘制堆叠柱形图。 然后,对于每个堆叠块(每个year的每个Type),分解为n个小块,每个小块的颜色根据位置在渐变中选取。 因此,步骤可能如下: 1. 计算每个Type在每个year中的堆叠位置(y_start和y_end)。 2. 对每个堆叠块,生成n个小块,每个小块的高度为 (y_end - y_start)/n。 3. 为每个小块分配颜色,根据Type的正负使用不同的颜色梯度。 4. 使用geom_rect绘制每个小块,x轴为year,y轴为每个小块的位置,fill为颜色。 这需要详细的数据处理步骤。 现在,编写代码示例: 首先,加载必要的包: library(ggplot2) library(dplyr) library(tidyr) # 用于pivot_longer 然后,数据处理: 假设原始数据已经转换为data_long: data_long <- data %>% pivot_longer( cols = c(rice, rice1, wheat, wheat1), names_to = "Type", values_to = "Value" ) 接下来,确定堆叠顺序。假设按照Type的顺序,但可能需要调整,例如先正后负,或者其他顺序。这里假设Type的顺序是rice, rice1, wheat, wheat1,因此需要按这个顺序排列以正确计算堆叠位置。 data_long <- data_long %>% mutate(Type = factor(Type, levels = c("rice", "rice1", "wheat", "wheat1"))) %>% arrange(years, Type) 然后,计算每个Type的堆叠位置: data_long <- data_long %>% group_by(years) %>% mutate( y_end = cumsum(Value), y_start = lag(y_end, default = 0) ) %>% ungroup() 接下来,确定每个Type的颜色类型: data_long <- data_long %>% mutate(color_type = if_else(Type %in% c("rice1", "wheat1"), "negative", "positive")) 然后,定义颜色梯度函数: color_pos <- colorRampPalette(c("#2166AC", "white", "#2166AC")) # 蓝色到白到蓝 color_neg <- colorRampPalette(c("#B2182B", "white", "#B2182B")) # 红色到白到红 选择颜色代码,例如使用RColorBrewer中的深蓝和深红。 接下来,设定分解的细分数n: n <- 100 # 渐变细分程度,数值越大渐变越平滑 然后,分解每个堆叠块为n个小块: data_gradient <- data_long %>% group_by(years, Type) %>% reframe( segment = 1:n, y_start_small = y_start + (segment - 1) * (y_end - y_start)/n, y_end_small = y_start + segment * (y_end - y_start)/n, color = if (first(color_type) == "positive") { color_pos(n)[segment] } else { color_neg(n)[segment] } ) %>% ungroup() 这里,对于每个堆叠块,分解为n个小区间,每个区间的颜色根据segment的位置从对应的颜色梯度中选取。 然后,绘制图表: ggplot(data_gradient) + geom_rect( aes( xmin = as.numeric(factor(years)) - 0.4, # 假设years是数值或因子 xmax = as.numeric(factor(years)) + 0.4, ymin = y_start_small, ymax = y_end_small, fill = color ) ) + scale_fill_identity() + # 使用实际颜色值 labs(x = "年份", y = "值", title = "堆叠柱形图带渐变颜色") + theme_minimal() 但需要注意以下几点: 1. years可能需要转换为因子或数值,以确定柱子的位置。如果years是数值,可以直接用;如果是字符或因子,需要转换为数值位置。 2. 柱子的宽度由xmin和xmax决定,这里假设每个柱子宽度为0.8(-0.4到+0.4)。 3. 由于每个小块都是独立绘制的,可能会影响性能,尤其是当数据量大时。n=100可能过高,可以适当降低到20或50。 此外,需要处理正负值的堆叠方向。例如,正值向上堆叠,负值向下堆叠。在计算y_start和y_end时,可能需要确保累积和正确计算,包括正负值的叠加。 可能还需要调整Type的排列顺序,以确保堆叠正确。例如,先堆叠正值部分,再堆叠负值部分,或者相反。这会影响y_start和y_end的计算结果。 另外,颜色渐变的方向可能需要根据堆叠的方向调整。例如,如果某个Type的值为正,渐变可能从下到上由蓝到白到蓝;如果为负,渐变可能从上到下由红到白到红。或者,无论正负,渐变方向都是中间白,两端颜色。这可能需要调整颜色函数的生成顺序。 例如,对于正值,颜色从下到上为蓝-白-蓝;对于负值,颜色从上到下为红-白-红。这样,在分解segment时,颜色的顺序需要相应调整。 或者,颜色始终是中间白,两侧同色,无论正值还是负值。因此,对于正值,渐变颜色在堆叠块的中间位置是白色,上下两端是蓝色;对于负值,中间是白色,上下两端是红色。但如何实现这一点? 这可能需要将颜色函数生成的颜色向量对称,中间是白色,然后根据segment的位置,无论正值还是负值,都从下到上应用颜色梯度。例如,对于正值的堆叠块,从下到上颜色是蓝到白到蓝,而负值的堆叠块,由于Value是负数,其堆叠方向向下,颜色可能也需要对应调整,比如从上到下是红到白到红。 因此,在分解负值的堆叠块时,可能需要反转颜色顺序,以确保即使堆叠方向向下,颜色渐变仍然中间白,两侧同色。 例如,对于负值的Type,分解的segment的颜色应该从红到白到红,但由于堆叠方向向下,可能需要将颜色顺序反转,或者调整segment的生成方式。 这可能需要更复杂的处理。例如,在生成颜色时,对于负值的Type,颜色顺序是否要反转取决于堆叠的方向。 或者,不管Value是正还是负,颜色渐变的方向总是从下到上为颜色1到白色到颜色1。对于负值的堆叠块,因为其高度是负的,所以y_end_small < y_start_small,因此颜色渐变的方向可能需要调整。 例如,在分解负值的Type时,segment的y_start_small和y_end_small会是递减的,因此在绘制时,颜色应该从下到上应用,但因为高度是负的,实际显示的方向是向下的。此时,颜色渐变的顺序可能需要调整,例如颜色函数生成的顺序是红-白-红,但在应用时,由于高度为负,可能需要反转颜色顺序,使得中间白色出现在中间位置。 这可能比较复杂,可能需要根据Value的正负来调整颜色顺序。 例如,对于正值,颜色顺序是蓝-白-蓝;对于负值,颜色顺序同样是红-白-红,但由于堆叠方向向下,可能需要将颜色顺序反转,使得在显示时,中间白色位于堆叠块的中间位置。 因此,在生成color时,对于负值的Type,颜色顺序应反转: 在代码中,对于负值的Type,color = rev(color_neg(n))[segment] 因此,修改数据处理的代码: 在生成color时: color = if (first(color_type) == "positive") { color_pos(n)[segment] } else { rev(color_neg(n))[segment] # 反转颜色顺序,使得负值块从上到下是红-白-红 } 这样,当负值的堆叠块向下延伸时,颜色从上到下是红-白-红,中间位置白色,与正值的蓝-白-蓝方向一致,中间白色在块的中间位置。 这可能更符合用户的需求。 总结以上思考,最终的代码可能如下: 首先,数据处理部分,包括计算堆叠位置,分解为小块,并生成颜色。 然后,绘图部分,使用geom_rect绘制每个小块。 最后,添加必要的注释,解释每个步骤的作用。 此外,还需要处理年份的x轴位置,可能需要将years转换为因子,以确保每个柱子正确对应年份。 例如,将years转换为因子: data_long$years <- factor(data_long$years) 然后在geom_rect中使用x = as.numeric(factor(years))来确定位置。 综上,完整的代码可能如下:</think>```r # 加载必要的包 library(ggplot2) library(dplyr) library(tidyr) # 创建示例数据(假设mydataexcel1已存在) data <- data.frame( years = mydataexcel1$year, rice = mydataexcel1$rice, rice1 = mydataexcel1$rice1, netGHG = mydataexcel1$netGHGemissions, wheat = mydataexcel1$wheat, wheat1 = mydataexcel1$wheat1 ) # 转换为长格式 data_long <- data %>% pivot_longer( cols = c(rice, rice1, wheat, wheat1), names_to = "Type", values_to = "Value" ) # 设定堆叠顺序并计算位置 data_long <- data_long %>% mutate( Type = factor(Type, levels = c("rice", "rice1", "wheat", "wheat1")), # 调整堆叠顺序 years = factor(years) # 将年份转为因子确保离散轴 ) %>% group_by(years) %>% arrange(Type) %>% # 按设定顺序排列 mutate( y_end = cumsum(Value), # 堆叠顶部位置 y_start = lag(y_end, default = 0) # 堆叠底部位置 ) %>% ungroup() # 定义颜色梯度函数 color_pos <- colorRampPalette(c("#2166AC", "white", "#2166AC")) # 正值为蓝-白-蓝 color_neg <- colorRampPalette(c("#B2182B", "white", "#B2182B")) # 负值为红-白-红 # 分解每个堆叠块为细小的渐变矩形(n控制渐变平滑度) n <- 50 # 数值越大渐变越平滑,但性能消耗越大 data_gradient <- data_long %>% group_by(years, Type) %>% reframe( segment = 1:n, # 计算每个小矩形的位置(注意处理正负值方向) ymin = if (Value[1] >= 0) { y_start + (segment - 1) * (y_end - y_start)/n } else { y_end + (segment - 1) * (y_start - y_end)/n # 负值反向计算 }, ymax = if (Value[1] >= 0) { y_start + segment * (y_end - y_start)/n } else { y_end + segment * (y_start - y_end)/n }, # 根据类型选择颜色并确保渐变方向 fill = if (Type %in% c("rice1", "wheat1")) { rev(color_neg(n))[segment] # 负值反向颜色顺序 } else { color_pos(n)[segment] } ) %>% ungroup() # 计算x轴位置(将因子年份转换为数值) data_gradient$x_pos <- as.numeric(data_gradient$years) # 绘制堆叠柱形图 ggplot(data_gradient) + geom_rect( aes( xmin = x_pos - 0.4, # 柱子宽度设为0.8 xmax = x_pos + 0.4, ymin = ymin, ymax = ymax, fill = fill ) ) + scale_fill_identity() + # 直接使用颜色编码 scale_x_continuous( breaks = unique(data_gradient$x_pos), labels = levels(data_long$years) # 显示原始年份标签 ) + labs( x = "年份", y = "排放量/产量", title = "堆叠柱形图(带渐变色)" ) + theme_minimal(base_size = 14) + theme( panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank() ) ``` ### 代码说明: 1. **数据预处理** - `pivot_longer()`将宽表转为长格式,符合ggplot2绘图要求 - 通过`factor(Type)`明确堆叠顺序,负值(`rice1`/`wheat1`)默认排在正值下方 2. **颜色方案** - `colorRampPalette()`生成中间白、两侧同色的渐变色 - 正值使用蓝-白-蓝,负值使用红-白-红增强对比 - 负值颜色反向(`rev()`)确保渐变方向与堆叠方向一致 3. **渐变实现** - 将每个堆叠块分解为`n`个小矩形,模拟渐变效果 - `segment`控制颜色插值位置,`ymin`/`ymax`精确计算每个色块坐标 4. **绘图细节** - `geom_rect()`绘制所有渐变色块 - `scale_x_continuous()`保持年份标签清晰 - `theme_minimal()`提供简洁的视觉样式 ### 效果特点: - **单柱内渐变**:每个色块内部从中间白向两端颜色过渡 - **正负对比**:蓝色系表示正值,红色系表示负值 - **自动堆叠**:正值向上累积,负值向下延伸,符合常规认知
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值