I need some help with forgi library for visualisation of RNA secondary structure.

I have an RNA sequence and dot-bracket notation of the secondary structure and I would like to plot 2D graph like that you can find here.

The input file is a .fx file, or a fasta file where the sequence is single-line and the third line is the dot-bracket notation of the RNA structure.


enter image description here

If there any other possibilities to plot it in real-time (for instance, in jupyter notebook avoiding any crossing external scripts), I will be very thankful to learn them!

  • $\begingroup$ Hi there, do I understand right that you got an RNA sequence and you with to predict the secondary structure and plot it within a jupyter notebook? Could you maybe edit your question to clarify what is exactly your input and desired output? $\endgroup$ Dec 11, 2018 at 14:13
  • 1
    $\begingroup$ cross posted : biostars.org/p/353919 $\endgroup$
    – Pierre
    Dec 11, 2018 at 17:54
  • $\begingroup$ @KamilSJaron, hi! I have an RNA sequence with it dot-bracket notation, for instance: seq = 'AAAACCGGGCCUUUUACCCCAAAUUGGAA' dot_bracket = '((((..(((..)))..))))...((..))' And for this seq and dot_bracket I want to plot 2D graph where edges will be biult according to dot_bracket and top will show the necessary nucleotide $\endgroup$ Dec 12, 2018 at 8:28
  • $\begingroup$ @kitsune_breeze Ah, I got it. Just note that you can edit your question to improve and I would strongly encourage you to do that if you find new clues or to add more details. For instance, what was the problem with forgi library? Could you share what you tried and what was the error you got? $\endgroup$ Dec 12, 2018 at 12:24
  • 1
    $\begingroup$ Awesome, that's something we can work at. Just edit your question and add this information. Something like, "I know how to create the plot in terminal by running .... However, I don't know how to call the command from jupyter notebook". I am trying to convince you here, that you should not write more information in comments but directly to question. ;-) $\endgroup$ Dec 12, 2018 at 15:04

2 Answers 2


I wrote a function to do that a while ago, maybe it helps. It only works with dot-bracket notation, and it turns it into ordered pairs which then you can easily plot.

import pandas as pd
import seaborn as sns

def dot_bracket_to_pairs(ss_string):
    Takes dot and bracket string, returns dataframe
    with paired bases.
    If any invalid characters are in the structure, it
    will interpret them as dots, as it only reads parentheses.
    index_list = []
    pairs = {}

    for index, char in enumerate(ss_string):
        if char == '(':
        if char == ')':
                # pair to last item in the list in dictionary
                pairs[index_list.pop()] = index
            except IndexError:
                print(f'Invalid structure, found extra \')\' in position {index}')

    if len(index_list) != 0:
        for item in index_list:
            print(f'Invalid structure, found extra in \'(\' in position {item}')

    df_pairs = pd.DataFrame(pairs.items(), columns=['Y', 'X'])

    return df_pairs

db_string = '((((((((((..(((((((.......)))))))......).((((((.......))))))..)))))))))'
df = dot_bracket_to_pairs(db_string)

sns.scatterplot(data=df, x="X", y="Y")
  • $\begingroup$ A cool, yet simple, solution, thank you. The plot is y-axis 5' and x-axis 3' ... switching would be clearer. A lot of coding is just the concept and this is cool. $\endgroup$
    – M__
    Jun 28, 2022 at 21:16

One way simply is to use VARNA, here is a link ... https://varna.lri.fr. This is well known for its power to view secondary structure (e.g. its in Jalview). It is generally considered the best viewer app for secondary structure.

However, the solution by @nquinoneso whilst simple, is preferable. The output is here:

enter image description here

The y-axis is the 3' and the x-axis is the 5', the dots represent hairpins. Whilst its simple, the power of this approach is the automation by direct access to the (pandas) dataframe.

I do recommend upvoting the post.

Complex secondary structure would not work because it will confuse the 5' stems with the immediate 3' stems which don't hybridise and a more advanced solution using nucleotide code would be needed. Thats the bit for further development, using the index both for the dot-bracket and the nucleotide sequence to confirm the hairpin. VARNA does perform this calculation (because it identifies canonical mutations)... but you can't access the underlying array/dataframe which is certainly a limitation.

  • $\begingroup$ Sorry, I got the x,y the wrong way round. The y-axis is the 5' end and the x-axis is the 3' end ... making the plot difficult to read. Obviously easy to correct. $\endgroup$
    – M__
    Jun 29, 2022 at 14:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.