Edinburgh-Genome-Foundry / DnaFeaturesViewer

:eye: Python library to plot DNA sequence features (e.g. from Genbank files)
https://edinburgh-genome-foundry.github.io/DnaFeaturesViewer/
MIT License
584 stars 90 forks source link

Vertical Plot #45

Open smk508 opened 3 years ago

smk508 commented 3 years ago

Hi, I'm wondering if it's possible to make vertically oriented plots using this library? Specifically, I am trying to do something like in this example except having the plot oriented vertically for a figure.

veghp commented 3 years ago

Hi, not out of the box I'm afraid. If it is a one-off, then the fastest way is to save as SVG: ax.figure.savefig("from_genbank.svg") Then open in Inkscape or another vector editor, then select each label and rotate 90 degrees (Object >> Transform >> Rotate >> Apply to each object separately >> Apply).

The algorithm in DNA Features Viewer finds the minimum number of levels that allows plotting the labels without overlap, and this works well and simple when the height of the levels, that is, the height of the letters, are the same. If the rotated labels were implemented, then you would get very wide plots, or overlaps as in the example below.

Was something like this below your intended outcome?

from_genbank svg

Zulko commented 3 years ago

In theory it is also possible to ask matplotlib to flip an ax by 90deg (all features and texts will appear vertically) but it is not straightforward. If that would work for you, see this stackoverflow answer as a starting point.

smk508 commented 3 years ago

I'll look into that, thanks. Yeah I was hoping there would be something that could be baked in to the plot automatically, so if I'm making a multi-axis plot, it's easy to scale everything. I basically wanted to show a heatmap depicting SNPs by patient and have a genome track to visualy depict the position. If I can't get the rotate axis trick to work, I'll try saving as an image or making the figure work horizontally.

Casperjamin commented 3 years ago

I would also be interested in this. I am currently trying to visualise a 350kb segment with ~50 elements of interest and the labels start to stack up really high. I believe this could be circumvented using a vertical plot

veghp commented 3 years ago

Thanks for the feedback. As for implementing this, I estimate it would be a significant re-write or addition: make vertical plots natively, then update compute_features_levels with an option to compute horizontal levels, which uses label width as level height -- and conversely use the constant text height for determining collisions. Alternatively, there could be a constant level height, but that likely leads to label overlaps (collisions).

Another option may be flipping the image as mentioned above, but I don't know how well that would work.