Coder Social home page Coder Social logo

Add label to flow about ggsankey HOT 5 OPEN

jpaulitz avatar jpaulitz commented on August 19, 2024 1
Add label to flow

from ggsankey.

Comments (5)

feizheng0209 avatar feizheng0209 commented on August 19, 2024 7

Hello @davidsjoberg thank you for this nice package. I have the same need of labeling the flows, I tried to retrieve the flow positions from the figure layers and add corresponding labels to them, but not succeed yet ... I'am wondering if you had already implemented this function or maybe have any suggestion on how to do this properly?

I come back here to answer my own question, and here is a solution to add flow size to each flow:
Suppose df is the data returned by the function make_long(), and p is the sankey plot you've made based on df

# get flow size for each flow
`flow_labels <- df %>% group_by(x, node, next_x, next_node) %>% tally() %>% drop_na()

# get corresponding positions of flows from the sankey plot
flow_info <- layer_data(p) %>% select(xmax, flow_start_ymax, flow_start_ymin) %>% distinct() # get flow related key positions related from the plot
flow_info <- flow_info[with(flow_info, order(xmax, flow_start_ymax)), ] # order the positions to match the order of flow_labels
rownames(flow_info) <- NULL # drop the row indexes
flow_info <- cbind(as.data.frame(flow_info), as.data.frame(flow_labels)) # bind the flow positions and the corresponding labels

# add labels to the flows
for (i in 1:nrow(flow_info)){
   p <- p + annotate("text", x = flow_info$xmax[i],
                       y = (flow_info$flow_start_ymin[i] + flow_info$flow_start_ymax[i])/2,
                       label = sprintf("%d", flow_info$n[i]), hjust = -1,
                       size = 3
                       )
 }

It's not a very elegant solution, but it works for me.

from ggsankey.

davidsjoberg avatar davidsjoberg commented on August 19, 2024 1

from ggsankey.

jpaulitz avatar jpaulitz commented on August 19, 2024 1

Great that you are working on that option!

I think there are 3 reasonable possibilities for the labels: Directly behind the source node, directly before the end node or in the middle of two nodes. I think the first two options will usually be most reasonable since these areas tend to be more homogeneous and not as messy as the midpoint between two nodes where the flows cross each other. The best option for me would be directly behind the source node in the middle (y-direction) of the flow.

from ggsankey.

blschum avatar blschum commented on August 19, 2024

Thanks much for this fantastic package, @davidsjoberg. I'm wondering if you've had a chance to build in this ^ functionality yet; I'm considering MacGyver-ing the code, but figured I'd check in before I do!

from ggsankey.

feizheng0209 avatar feizheng0209 commented on August 19, 2024

Hello @davidsjoberg thank you for this nice package. I have the same need of labeling the flows, I tried to retrieve the flow positions from the figure layers and add corresponding labels to them, but not succeed yet ...
I'am wondering if you had already implemented this function or maybe have any suggestion on how to do this properly?

from ggsankey.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.