DnaFeaturesViewer icon indicating copy to clipboard operation
DnaFeaturesViewer copied to clipboard

Vertical Plot

Open smk508 opened this issue 5 years ago • 5 comments

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.

smk508 avatar Oct 08 '20 22:10 smk508

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

veghp avatar Oct 10 '20 13:10 veghp

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.

Zulko avatar Oct 10 '20 15:10 Zulko

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.

smk508 avatar Oct 12 '20 03:10 smk508

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

Casperjamin avatar Jul 23 '21 10:07 Casperjamin

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.

veghp avatar Jul 23 '21 10:07 veghp