Почему matplotlib автоматически сортирует значения по возрастанию в списке?

Рейтинг: 0Ответов: 2Опубликовано: 17.02.2023

В первый контейнер добавляю три значения:

L = float(2.2)
list_of_fluxex = []
list_of_current = []


def input_current():
    """
    функция принимает и сохраняет значения тока
    :return: список значений тока (до 3 включительно)
    """
    count = 0
    while count < 3:
        x = input(f"Введите значение тока №{count + 1}: ")
        count += 1
        list_of_current.append(float(x))
    return list_of_current

После вызова функции заполняю второй контейнер:

for all_fluxex in range(len(list_of_current)):
    flux = round(list_of_current[all_fluxex] * L, 2)
    list_of_fluxex.append(flux)

И несмотря на ЛЮБЫЕ значения, matplotlib создаёт исключительно возрастающий график

import matplotlib.pyplot as plt
from main2 import list_of_current, list_of_fluxex


current = [list_of_current[0], list_of_current[1], list_of_current[2]]

flux = [list_of_fluxex[0], list_of_fluxex[1], list_of_fluxex[2]]

plt.plot(current, flux, marker="o")

plt.xlabel("current")
plt.ylabel("flux")

plt.grid(True)

plt.show()

введите сюда описание изображения

Но стоит в значения вписать любые цифры, всё показывается как надо. Как такое возможно?

current = [5, 2, 9]

flux = [15, 12, 6]

Ответы

▲ 1Принят

В дополнение к ответу passant покажу в общем-то тоже самое, но другими словами и средствами.

import matplotlib.pyplot as plt

current = [2, 3, 1]
flux = [2.2*x for x in current]

plt.plot(current, flux, marker="o")

for i, (x, y) in enumerate(zip(current, flux), 1):
    plt.text(x - 0.05, y + 0.1, i, c='red')

plt.xlabel("current")
plt.ylabel("flux")
plt.grid(True)
plt.show()

введите сюда описание изображения

На этом графике обозначены шаги построения графика. Да, получается, что если следовать по точкам по очереди, то график не только возрастает от точки 1 до точки 2, но и падает от точки 2 к точке 3. Проблема в том, что все точки расположены на одной линии из-за того, что ваша функция линейная, вида y = x * 2.2. И точки на осях всегда рисуются отсортированными, иначе какой вообще смысл в графиках на координатах, если по осям будут произвольные значения в произвольном порядке. Вот и получается в итоге, что да - график всегда возрастает, вне зависимости от порядка рисования точек, но это в точности отражает природу вашей функции - все её точки расположены на одной прямой линии, поэтому у неё и должен быть график в виде одной прямой линии с несколькими точками на ней.

▲ 1

Ну и запутали вы всех :-). Даже интересно стало, но поскольку я в чудеса не верю, пришлось сделать расследование и вывести "вас на чистую воду". Ну, сначала находим нужное место для input_current (), конечно. Потом вводим три числа. Пусть они буду ваши же current = [5, 2, 9].

введите сюда описание изображения

Теперь вводим ваш второй пример. current = [5, 2, 9] и flux = [15, 12, 6]. И видим на экране то, что вы нам и представили.

введите сюда описание изображения

Но мы же не верим в чудеса. И берем другой пример current = [5, 2, 9] и flux = [11.0, 4.4, 19.8]. И увы, все чудеса улетучиваются.

введите сюда описание изображения Оказывается, что plt.plot() работает как надо, рисует в том порядке, что вы и задали. Вот только в вашем первом примере все данные лежат на прямой, поскольку вы генерировали свой второй массив как линейную функцию

list_of_current[all_fluxex] * L

и увидеть, в каком порядке точки наносились на график не могли. А во втором вашем примере - задавали произвольные точки. Вот и "проявился" порядок их нанесения.

Но головоломка оказалась знатная. И для программиста - очень полезная. Я всегда говорю, что отлаживать программу и умение находить в ней ошибки на много важнее, чем умение просто кодировать.