Matplotlib, python, jak najít body, kde přímka protíná osu x

0

Otázka

Pracoval jsem na nějaký kód, řešit kvadratické rovnice a vyneste ji do grafu, chci se tečka na body, kde přímka protíná osu x a souřadnice bodů zobrazí pod nimi. To je to, co kód dělá. To je to, co chci, aby to udělat.

Kód je následující:

import matplotlib

matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np
import math


def int_input(prompt):
    while True:
        try:
            variable_name = int(input(prompt))
            return variable_name
        except ValueError:
            print("Please enter a whole number (in digits)")


def float_input(prompt):
    while True:
        try:
            variable_name = float(input(prompt))
            return variable_name
        except ValueError:
            print("Please enter a numeric value (in digits)")


def yes_input(prompt):
    while True:
        variable_name = input(prompt).lower()
        if variable_name in ["y", "yes"]:
            return "yes"
        elif variable_name in ["n", "no"]:
            return "no"
        else:
            print("""Please enter either "y" or "n". """)


print("Quadratic Solver")

while True:

    print("Input below the values of a, b and c from an equation that is of the form : ax² + bx + c = 0")
    a = float_input('a: ')

    b = float_input('b: ')

    c = float_input('c: ')

    # calculate the discriminant
    d = (b ** 2) - (4 * a * c)

    # find two solutions
    try:
        solution1 = (-b - math.sqrt(d)) / (2 * a)
    except ValueError:
        solution1 = "none"

    try:
        solution2 = (-b + math.sqrt(d)) / (2 * a)
    except ValueError:
        solution2 = "none"

    if solution1 == solution2:
        if solution1 == "none":
            print("There are no solutions.")
        else:
            print("There is one solution: x = {0}".format(solution1))

    elif solution1 != solution2:
        print('There are two solutions, x can be either {0} or {1}'.format(solution1, solution2))

    graph = yes_input("Do you want to plot that on a graph? (y/n):  ")
    if graph == "yes":
        x = np.linspace(-6, 6, 50)

        fig = plt.figure(figsize=(7, 4))

        y4 = a * x ** 2 + b * x + c
        plt.plot(x, y4, 'g:', label='Degree 2')

        # Add features to our figure
        plt.legend()
        plt.grid(True, linestyle=':')
        plt.xlim([-6, 6])
        plt.ylim([-4, 4])

        plt.title(f'A graph of {a}x² + {b}x + {c} = 0')
        plt.xlabel('x-axis')
        plt.ylabel('y-axis')
        plt.get_current_fig_manager().window.wm_geometry("+0+0")
        fig.canvas.manager.window.attributes('-topmost', 1)
        # Show plot
        plt.show()
    new_question = yes_input('New question? (y/n): ')
    if new_question == "no":
        break

Já jsem na OS windows a používám IntelliJ IDEA upravit můj kód pythonu.

matplotlib python
2021-11-23 22:42:07
1

Nejlepší odpověď

1

Přidat tečky na grafu z kvadratické rovnice, můžete použít plt.děj funkci s kruhy značky a použití plt.text k tisku souřadnice bodů.

Podívejte se na moje řešení na základě vašeho kódu. To není nejčistší, ale to je snadno pochopitelné (linka 86-96).

import matplotlib

matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np
import math

def int_input(prompt):
    while True:
        try:
            variable_name = int(input(prompt))
            return variable_name
        except ValueError:
            print("Please enter a whole number (in digits)")


def float_input(prompt):
    while True:
        try:
            variable_name = float(input(prompt))
            return variable_name
        except ValueError:
            print("Please enter a numeric value (in digits)")


def yes_input(prompt):
    while True:
        variable_name = input(prompt).lower()
        if variable_name in ["y", "yes"]:
            return "yes"
        elif variable_name in ["n", "no"]:
            return "no"
        else:
            print("""Please enter either "y" or "n". """)


print("Quadratic Solver")

while True:

    print("Input below the values of a, b and c from an equation that is of the form : ax² + bx + c = 0")
    a = float_input('a: ')

    b = float_input('b: ')

    c = float_input('c: ')

    # calculate the discriminant
    d = (b ** 2) - (4 * a * c)

    # find two solutions
    try:
        solution1 = (-b - math.sqrt(d)) / (2 * a)
    except ValueError:
        solution1 = "none"

    try:
        solution2 = (-b + math.sqrt(d)) / (2 * a)
    except ValueError:
        solution2 = "none"

    if solution1 == solution2:
        if solution1 == "none":
            print("There are no solutions.")
        else:
            print("There is one solution: x = {0}".format(solution1))

    elif solution1 != solution2:
        print('There are two solutions, x can be either {0} or {1}'.format(solution1, solution2))

    graph = yes_input("Do you want to plot that on a graph? (y/n):  ")
    if graph == "yes":
        x = np.linspace(-6, 6, 50)

        fig = plt.figure(figsize=(7, 4))

        y4 = a * x ** 2 + b * x + c
        plt.plot(x, y4, 'g:', label='Degree 2')

        # Add features to our figure
        plt.legend()
        plt.grid(True, linestyle=':')
        plt.xlim([-6, 6])
        plt.ylim([-4, 4])

        # Add dots
        offset = 0.3

        if solution1 == solution2:
            if solution1 != "none":
                plt.plot(solution1, 0 , marker="o", markersize=10, color="black", linestyle="None")
                plt.text(solution1, 0-offset, f'({solution1}, {0})', ha='center', va='center')
        elif solution1 != solution2:
            plt.plot([solution1, solution2], [0, 0], marker="o", markersize=10, color="black", linestyle="None")
            plt.text(solution1, 0-offset, f'({solution1}, {0})', ha='center', va='center')
            plt.text(solution2, 0-offset, f'({solution2}, {0})', ha='center', va='center')


        plt.title(f'A graph of {a}x² + {b}x + {c} = 0')
        plt.xlabel('x-axis')
        plt.ylabel('y-axis')
        plt.get_current_fig_manager().window.wm_geometry("+0+0")
        fig.canvas.manager.window.attributes('-topmost', 1)
        # Show plot
        plt.show()
    new_question = yes_input('New question? (y/n): ')
    if new_question == "no":
        break
2021-11-24 09:07:47

Díky za pomoc, je tam nějaký způsob, jak dostat text pod bod? Jsem upvoted své řešení, a pokud máte řešení, jak se text pod bod přijímám to jako nejlepší odpověď.
Raed Ali

, Aby tak učinily, můžete jednoduše substrace offset hodnoty na souřadnici textu. Jsem upravil moje odpověď na jeho provedení. Ale pro složitější popisy, zkontrolujte, plt.anotace().
yannvm

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................