Я просто столкнулся с проблемой, когда понял, что рисую строковые данные, и мои графики не отражают данные, с которыми я имел дело. Похоже, что matplotlib.pyplot не выдает ошибки, когда ему передается строковое значение, и он продолжает что-то строить, но что именно он рисует? Он показывает числа для масштабной линейки, но это просто список строковых значений без учета числовых соотношений. Как он решает, где наносить точки?

Вот фрагмент кода, иллюстрирующий мой вопрос и сюжет ниже.

import matplotlib.pyplot as plt

# Define data arrays
x = range(10)
data = [4.73, 5.01, 5.29, 6.75, 4.48, 4.49, 5.44, 5.53, 4.89, 4.59]
strData = ['4.73', '5.01', '5.29', '6.75', '4.48', '4.49', '5.44', '5.53', '4.89', '4.59']

# Open figure for plotting
fig = plt.figure()

# Define axis for plotting
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()

# Plot data
lns1 = ax1.plot(x, data, '-r', label = 'Float')
# Plot string data  
lns2 = ax2.plot(x, strData, 'ob', label = 'String')

# Compile labels
lns = lns1+lns2
labs = [l.get_label() for l in lns]

# Plot the legend
fig.legend(lns, labs, loc='upper right', fontsize= 9, prop={'size':9}, numpoints=1, framealpha=1)

# Show figure
plt.show()

enter image description here

1
Casivio 15 Апр 2020 в 02:21

1 ответ

Лучший ответ

Как вы можете видеть, он будет использовать строки в том порядке, в котором вы их предоставили, то есть сначала будет построена строка с наименьшим индексом, а затем следующая с индексом 1 (как вы можете видеть на второй оси Y, где 4,73 - это за ними следуют 5.01 и 5.29.Расстояние между каждым значением равно единице, так как matplotlib не имеет концепции сортировки строк.

Вы можете видеть, что если вы используете диапазон вместо списка строк:

strData = list(range(10))
ax2.set_yticks(strData)

Это даст тот же результат: введите описание изображения здесь

1
SilverMonkey 15 Апр 2020 в 00:25