Python: Как правильно масштабировать точки на этом графике по оси X? - PullRequest
0 голосов
/ 26 февраля 2020

Это мой набор данных:

Date           Price    Peak     Trough
01-Jan-2002    33.78    False    False
02-Jan-2002    34.19    False    False
03-Jan-2002    35.44    False    False
04-Jan-2002    36.75    True     False
05-Jan-2002    32.28    False    True

Я хочу построить Цена в виде линейного графика с датой в виде оси X. Всякий раз, когда Пик равен True , на линии должна быть зеленая точка, а когда Trough равен True , на линии должна быть красная точка.

Должно выглядеть следующим образом:

Example

Лучшее решение было бы, если бы я мог просто закодировать его, чтобы оно показывало смысл, когда условие истинно. Но я не знаю как, поэтому я попытался создать два новых кадра данных. В df1 все точки данных, где Пик - Истина, в df2 - все точки, где Падь Истина. Затем я попытался построить 3 кадра данных на одном графике следующим образом:

df.plot(x = 'Date', y = 'Price', figsize=(16,10))
plt.scatter(x = dfP['Date'], y = dfP['Price'], c = 'green')
plt.scatter(x = dfT['Date'], y = dfT['Price'], c = 'red')
plt.yscale('log')

Однако он не масштабирует точки правильно:

Plot

Как можно Я правильно масштабирую даты для баллов? Или есть более простой способ, когда я могу просто установить точку, когда условие выполняется? Заранее спасибо.

Редактировать: Решением было не смешивать pandas с matplotlib. Код теперь выглядит следующим образом:

plt.figure(figsize=(16,10))
plt.plot(df['Date'], df['Dow Chemical Company (The)'])
plt.scatter(x = dfP['Date'], y = dfP['Dow Chemical Company (The)'], c = 'green')
plt.scatter(x = dfT['Date'], y = dfT['Dow Chemical Company (The)'], c = 'red')
plt.yscale('log')

Все точки теперь правильно отображаются на линии, но он показывает каждую отдельную дату на оси X, которую мне нужно исправить.

1 Ответ

0 голосов
/ 26 февраля 2020

Моей первой мыслью было использование markevery в matplotlib, которое добавляет кружки на линию, но они должны быть того же цвета, что и линия. Я думаю, что ваш apporach с отдельными scatter участками является правильным. Я только что заменил True на Price и False на NaN. (При необходимости сделайте копию!) Достаточно близко к желаемому результату:

df.loc[df.Peak, 'Peak'] = df.loc[df.Peak, 'Price']
df.loc[df.Trough, 'Trough'] = df.loc[df.Trough, 'Price']
df = df.replace(False, np.NaN)

f, ax = plt.subplots(figsize=(10, 10))
plt.grid()
plt.plot(df.set_index('Date')['Price'], color='b', label='sunspot_SWO')
plt.scatter(df.Date, troughs, label='min', color='r')
plt.scatter(df.Date, peaks, label='max', color='g')
plt.legend(loc='lower right');

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...