garrettj403 / SciencePlots

Matplotlib styles for scientific plotting
MIT License
6.96k stars 700 forks source link

[Bug]: TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'. #88

Closed DongdongGui closed 1 year ago

DongdongGui commented 1 year ago

Environment

System: Windows-10-10.0.19041-SP0
Python: 3.8.3 (default, Jul  2 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)]
SciencePlots: 2.0.1
Matplotlib: 3.7.1
Latex distro: (populate manually)

Describe the issue here

Using Matplotlib: 3.7.1 with TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'. However, Matplotlib: 3.2.2 can be used.

How can we reproduce it? What have you tried?

import numpy as np import matplotlib.pyplot as plt import scienceplots

def model(x, p): return x * (2 p + 1) / (1 + x * (2 p))

pparam = dict(xlabel='Voltage (mV)', ylabel=r'Current ($\mu$A)')

x = np.linspace(0.75, 1.25, 201)

with plt.style.context(['science']): fig, ax = plt.subplots() for p in [10, 15, 20, 30, 50, 100]: ax.plot(x, model(x, p), label=p) ax.legend(title='Order') ax.autoscale(tight=True) ax.set(**pparam)

Extra info

No response

echedey-ls commented 1 year ago

Next time, provide code with triple backticks: ``` code ``` Can't reproduce with following code (only added plt.show() inside the with context):

import numpy as np
import matplotlib.pyplot as plt
import scienceplots

def model(x, p):
    return x ** (2 * p + 1) / (1 + x ** (2 * p))

pparam = dict(xlabel='Voltage (mV)', ylabel=r'Current ($\mu$A)')

x = np.linspace(0.75, 1.25, 201)

with plt.style.context(['science']):
    fig, ax = plt.subplots()
    for p in [10, 15, 20, 30, 50, 100]:
        ax.plot(x, model(x, p), label=p)
    ax.legend(title='Order')
    ax.autoscale(tight=True)
    ax.set(**pparam)
    plt.show()

Check indentation and/or copy from the examples file in the repo.

DongdongGui commented 1 year ago

image

import numpy as np
import matplotlib.pyplot as plt
import scienceplots

def model(x, p):
    return x ** (2 * p + 1) / (1 + x ** (2 * p))

pparam = dict(xlabel='Voltage (mV)', ylabel=r'Current ($\mu$A)')

x = np.linspace(0.75, 1.25, 201)

with plt.style.context(['science']):
    fig, ax = plt.subplots()
    for p in [10, 15, 20, 30, 50, 100]:
        ax.plot(x, model(x, p), label=p)
    ax.legend(title='Order')
    ax.autoscale(tight=True)
    ax.set(**pparam)
    plt.show()

I run the above code and still report TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'.

DongdongGui commented 1 year ago

test 1.zip

DongdongGui commented 1 year ago

Test1. zip is the running file

echedey-ls commented 1 year ago

I'm pretty sure it has nothing to do with SciencePlots. Edit: try with [] styles instead of ['science'] to isolate the issue and check if that's the case. I don't have your same setup, and it will take me some time till I can try it. I've only tested locally with basic Python and on Google Colab. Have you tried updating Anaconda and IPython? It looks like a problem between Matplotlib and the output formatter.

Thanks for sharing the resources.

DongdongGui commented 1 year ago

Thank you for your reply! image I tried using the '[ ]' style and '["science","notebook"]' style, both of which worked properly, but other styles still report the TypeError.

echedey-ls commented 1 year ago

I'm glad to hear that!