如何用R的Plotly包实现正负值分置的镜像柱状图?
镜像柱状图绘制问题修正
问题说明
需要绘制镜像柱状图,使正值(上调)显示在X轴上方,负值(下调)显示在X轴下方,但运行以下R代码后,正负值均位于X轴上方,需修正代码实现需求。
原代码
library(plotly) Region <- c("Cerebellum","Cortex","Hippocampus", "Striatum") Positive <- c(sum(DataToPlot_Mouse_REJ$Cb_MicREJ > 0),sum(DataToPlot_Mouse_REJ$Ctx_MicREJ > 0),sum(DataToPlot_Mouse_REJ$Hipc_MicREJ > 0),sum(DataToPlot_Mouse_REJ$Str_MicREJ > 0) ) Negative <- c(sum(DataToPlot_Mouse_REJ$Cb_MicREJ < 0),sum(DataToPlot_Mouse_REJ$Ctx_MicREJ < 0),sum(DataToPlot_Mouse_REJ$Hipc_MicREJ < 0),sum(DataToPlot_Mouse_REJ$Str_MicREJ < 0) ) df <- data.frame(Region,Positive,Negative ) plot_ly(df) %>% add_trace(x = ~Region, y = ~Positive, type = 'bar', name = 'UpRegulated', marker = list(color = '#33adff'), hovertemplate = paste('Positive: %{y}', ' Region: %{x} ')) %>% add_trace(x = ~Region, y = ~Negative, type = 'bar', name = 'DownRegulated', marker = list(color = '#ff6666'), hovertemplate = paste('Negative: %{y}', ' Region: %{x} '))
数据集
| Region | Positive | Negative |
|---|---|---|
| Cerebellum | 550 | 115 |
| Cortex | 90 | 97 |
| Hippocampus | 170 | 128 |
| Striatum | 417 | 39 |
当前效果

修正方案
核心是将代表下调数量的Negative列值转为负数,让plotly将其绘制在X轴下方,同时在悬浮提示中显示绝对值,避免出现负数显示。
修正后的代码:
library(plotly) Region <- c("Cerebellum","Cortex","Hippocampus", "Striatum") Positive <- c(sum(DataToPlot_Mouse_REJ$Cb_MicREJ > 0),sum(DataToPlot_Mouse_REJ$Ctx_MicREJ > 0),sum(DataToPlot_Mouse_REJ$Hipc_MicREJ > 0),sum(DataToPlot_Mouse_REJ$Str_MicREJ > 0) ) Negative <- c(sum(DataToPlot_Mouse_REJ$Cb_MicREJ < 0),sum(DataToPlot_Mouse_REJ$Ctx_MicREJ < 0),sum(DataToPlot_Mouse_REJ$Hipc_MicREJ < 0),sum(DataToPlot_Mouse_REJ$Str_MicREJ < 0) ) df <- data.frame(Region,Positive,Negative ) # 将Negative转为负数,实现镜像效果 df$Negative <- -df$Negative plot_ly(df) %>% add_trace(x = ~Region, y = ~Positive, type = 'bar', name = '上调', marker = list(color = '#33adff'), hovertemplate = paste('上调数量: %{y}', '<br>区域: %{x}<extra></extra>')) %>% add_trace(x = ~Region, y = ~Negative, type = 'bar', name = '下调', marker = list(color = '#ff6666'), hovertemplate = paste('下调数量: %{y*-1}', '<br>区域: %{x}<extra></extra>')) %>% # 可选:调整Y轴标签,让显示更直观 layout(yaxis = list(title = '数量', tickformat = 'd'))
修改说明
- 添加
df$Negative <- -df$Negative,将下调数量转为负数,使其显示在X轴下方 - 调整下调系列的
hovertemplate,用%{y*-1}显示绝对值,避免悬浮提示出现负数 - 可选:优化Y轴标签和格式,提升图表可读性
内容的提问来源于stack exchange,提问作者Huma Naz
相关产品推荐
相关产品推荐

