Saurabh
Saurabh

Reputation: 6920

Error While Showing Matplotlib Figure in Flask

I'm taking two inputs from a flask endpoint. The first value is a string type and the other is also a string which I'm converting to an int type.

When I pass these values from the flask script, to another script which produces a pie-chart using matplotlib.pyplot, I get an error:

analyzer.py:114: UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail.
  patches, texts = plt.pie(sizes, colors=colors, startangle=90)
2020-11-29 20:02:23.430 Python[48923:2857853] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSWindow drag regions should only be invalidated on the Main Thread!'

However, when I run the piechart producing script (analyzer.py) directly, I'm able to see the expected output, and the figure is also produced in the specified directory.

Below is the function which is causing the issue:

def plotPieChart(self, positive, wpositive, spositive, negative,
            wnegative, snegative, neutral, searchTerm, noOfSearchTerms):
    
    labels = ['positive [' + str(positive) + '%]', 'Weakly positive ['
              + str(wpositive) + '%]','Strongly positive [' + str(spositive)
              + '%]', 'Neutral [' + str(neutral) + '%]', 'Negative ['
              + str(negative) + '%]', 'Weakly Negative [' + str(wnegative)
              + '%]', 'Strongly Negative [' + str(snegative) + '%]']
              
    sizes = [positive, wpositive, spositive, neutral, negative, wnegative, snegative]
    
    colors = ['yellowgreen','lightgreen','darkgreen', 'gold', 'red','lightsalmon','darkred']
    
    patches, texts = plt.pie(sizes, colors=colors, startangle=90)
    
    plt.legend(patches, labels, loc="best")
    
    plt.title('How people are reacting on ' + searchTerm + ' by analyzing '
        + str(noOfSearchTerms) + ' Tweets.')
    
    plt.axis('equal')
    
    plt.tight_layout()
    
    # plt.show()
    plt.savefig('app/static/images/piechart.png')

Complete stdout stack trace:

analyzer.py:114: UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail.
  patches, texts = plt.pie(sizes, colors=colors, startangle=90)
2020-11-29 20:02:23.430 Python[48923:2857853] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSWindow drag regions should only be invalidated on the Main Thread!'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff30458b57 __exceptionPreprocess + 250
    1   libobjc.A.dylib                     0x00007fff692a45bf objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff3048134c -[NSException raise] + 9
    3   AppKit                              0x00007fff2d67b5ec -[NSWindow(NSWindow_Theme) _postWindowNeedsToResetDragMarginsUnlessPostingDisabled] + 310
    4   AppKit                              0x00007fff2d663052 -[NSWindow _initContent:styleMask:backing:defer:contentView:] + 1416
    5   AppKit                              0x00007fff2d662ac3 -[NSWindow initWithContentRect:styleMask:backing:defer:] + 42
    6   _macosx.cpython-39-darwin.so        0x000000010b17d8a5 -[Window initWithContentRect:styleMask:backing:defer:withManager:] + 69
    7   _macosx.cpython-39-darwin.so        0x000000010b1813fd FigureManager_init + 269
    8   Python                              0x00000001002ababa wrap_init + 12
    9   Python                              0x0000000100269732 wrapperdescr_call + 316
    10  Python                              0x0000000100262b47 _PyObject_MakeTpCall + 266
    11  Python                              0x000000010030abd7 call_function + 455
    12  Python                              0x0000000100307d34 _PyEval_EvalFrameDefault + 27452
    13  Python                              0x00000001002631ec function_code_fastcall + 97
    14  Python                              0x0000000100262a0b _PyObject_FastCallDictTstate + 212
    15  Python                              0x0000000100263435 _PyObject_Call_Prepend + 139
    16  Python                              0x00000001002aba1e slot_tp_init + 87
    17  Python                              0x00000001002a521b type_call + 150
    18  Python                              0x0000000100262b47 _PyObject_MakeTpCall + 266
    19  Python                              0x000000010030abd7 call_function + 455
    20  Python                              0x0000000100307d34 _PyEval_EvalFrameDefault + 27452
    21  Python                              0x00000001002631ec function_code_fastcall + 97
    22  Python                              0x0000000100264e4f method_vectorcall + 164
    23  Python                              0x000000010030aba3 call_function + 403
    24  Python                              0x0000000100307d34 _PyEval_EvalFrameDefault + 27452
    25  Python                              0x000000010030b6eb _PyEval_EvalCode + 1998
    26  Python                              0x000000010026317c _PyFunction_Vectorcall + 248
    27  Python                              0x0000000100264e4f method_vectorcall + 164
    28  Python                              0x0000000100262ec3 PyVectorcall_Call + 146
    29  Python                              0x0000000100308064 _PyEval_EvalFrameDefault + 28268
    30  Python                              0x000000010030b6eb _PyEval_EvalCode + 1998
    31  Python                              0x000000010026317c _PyFunction_Vectorcall + 248
    32  Python                              0x0000000100262ec3 PyVectorcall_Call + 146
    33  Python                              0x0000000100308064 _PyEval_EvalFrameDefault + 28268
    34  Python                              0x000000010030b6eb _PyEval_EvalCode + 1998
    35  Python                              0x000000010026317c _PyFunction_Vectorcall + 248
    36  Python                              0x000000010030aba3 call_function + 403
    37  Python                              0x0000000100307de0 _PyEval_EvalFrameDefault + 27624
    38  Python                              0x00000001002631ec function_code_fastcall + 97
    39  Python                              0x000000010030aba3 call_function + 403
    40  Python                              0x0000000100307de0 _PyEval_EvalFrameDefault + 27624
    41  Python                              0x000000010030b6eb _PyEval_EvalCode + 1998
    42  Python                              0x000000010026317c _PyFunction_Vectorcall + 248
    43  Python                              0x000000010030aba3 call_function + 403
    44  Python                              0x0000000100307de0 _PyEval_EvalFrameDefault + 27624
    45  Python                              0x000000010030b6eb _PyEval_EvalCode + 1998
    46  Python                              0x000000010026317c _PyFunction_Vectorcall + 248
    47  Python                              0x000000010030aba3 call_function + 403
    48  Python                              0x0000000100307e9e _PyEval_EvalFrameDefault + 27814
    49  Python                              0x00000001002631ec function_code_fastcall + 97
    50  Python                              0x000000010030aba3 call_function + 403
    51  Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    52  Python                              0x00000001002631ec function_code_fastcall + 97
    53  Python                              0x000000010030aba3 call_function + 403
    54  Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    55  Python                              0x00000001002631ec function_code_fastcall + 97
    56  Python                              0x0000000100308064 _PyEval_EvalFrameDefault + 28268
    57  Python                              0x00000001002631ec function_code_fastcall + 97
    58  Python                              0x000000010030aba3 call_function + 403
    59  Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    60  Python                              0x00000001002631ec function_code_fastcall + 97
    61  Python                              0x000000010030aba3 call_function + 403
    62  Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    63  Python                              0x00000001002631ec function_code_fastcall + 97
    64  Python                              0x000000010030aba3 call_function + 403
    65  Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    66  Python                              0x00000001002631ec function_code_fastcall + 97
    67  Python                              0x0000000100262a0b _PyObject_FastCallDictTstate + 212
    68  Python                              0x0000000100263435 _PyObject_Call_Prepend + 139
    69  Python                              0x00000001002aae83 slot_tp_call + 87
    70  Python                              0x0000000100262b47 _PyObject_MakeTpCall + 266
    71  Python                              0x000000010030abd7 call_function + 455
    72  Python                              0x0000000100307d34 _PyEval_EvalFrameDefault + 27452
    73  Python                              0x00000001002631ec function_code_fastcall + 97
    74  Python                              0x0000000100262a0b _PyObject_FastCallDictTstate + 212
    75  Python                              0x0000000100263435 _PyObject_Call_Prepend + 139
    76  Python                              0x00000001002aae83 slot_tp_call + 87
    77  Python                              0x0000000100262b47 _PyObject_MakeTpCall + 266
    78  Python                              0x000000010030abd7 call_function + 455
    79  Python                              0x0000000100307d34 _PyEval_EvalFrameDefault + 27452
    80  Python                              0x00000001002710c5 gen_send_ex + 269
    81  Python                              0x0000000100307629 _PyEval_EvalFrameDefault + 25649
    82  Python                              0x000000010030b6eb _PyEval_EvalCode + 1998
    83  Python                              0x000000010026317c _PyFunction_Vectorcall + 248
    84  Python                              0x000000010030aba3 call_function + 403
    85  Python                              0x0000000100307de0 _PyEval_EvalFrameDefault + 27624
    86  Python                              0x000000010030b6eb _PyEval_EvalCode + 1998
    87  Python                              0x000000010026317c _PyFunction_Vectorcall + 248
    88  Python                              0x000000010030aba3 call_function + 403
    89  Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    90  Python                              0x00000001002631ec function_code_fastcall + 97
    91  Python                              0x000000010030aba3 call_function + 403
    92  Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    93  Python                              0x00000001002631ec function_code_fastcall + 97
    94  Python                              0x000000010030aba3 call_function + 403
    95  Python                              0x0000000100307d34 _PyEval_EvalFrameDefault + 27452
    96  Python                              0x00000001002631ec function_code_fastcall + 97
    97  Python                              0x000000010030aba3 call_function + 403
    98  Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    99  Python                              0x00000001002631ec function_code_fastcall + 97
    100 Python                              0x0000000100262a0b _PyObject_FastCallDictTstate + 212
    101 Python                              0x0000000100263435 _PyObject_Call_Prepend + 139
    102 Python                              0x00000001002aba1e slot_tp_init + 87
    103 Python                              0x00000001002a521b type_call + 150
    104 Python                              0x0000000100262b47 _PyObject_MakeTpCall + 266
    105 Python                              0x000000010030abd7 call_function + 455
    106 Python                              0x0000000100307d34 _PyEval_EvalFrameDefault + 27452
    107 Python                              0x00000001002631ec function_code_fastcall + 97
    108 Python                              0x000000010030aba3 call_function + 403
    109 Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    110 Python                              0x00000001002631ec function_code_fastcall + 97
    111 Python                              0x0000000100264f52 method_vectorcall + 423
    112 Python                              0x0000000100308064 _PyEval_EvalFrameDefault + 28268
    113 Python                              0x00000001002631ec function_code_fastcall + 97
    114 Python                              0x000000010030aba3 call_function + 403
    115 Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    116 Python                              0x00000001002631ec function_code_fastcall + 97
    117 Python                              0x000000010030aba3 call_function + 403
    118 Python                              0x0000000100307d18 _PyEval_EvalFrameDefault + 27424
    119 Python                              0x00000001002631ec function_code_fastcall + 97
    120 Python                              0x0000000100264edb method_vectorcall + 304
    121 Python                              0x000000010038514f t_bootstrap + 70
    122 Python                              0x0000000100344ff1 pythread_wrapper + 25
    123 libsystem_pthread.dylib             0x00007fff6a651109 _pthread_start + 148
    124 libsystem_pthread.dylib             0x00007fff6a64cb8b thread_start + 15
)
libc++abi.dylib: terminating with uncaught exception of type NSException

I've followed this answer to use the output of matplotlib in flask.

Please let me know how I can get around this issue?

Upvotes: 2

Views: 3366

Answers (1)

Saurabh
Saurabh

Reputation: 6920

I solved this by using the Agg back-end, which is non-GUI:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

Upvotes: 11

Related Questions