1

This is killing me. How do I modify this code so that the chart displays as a scatterplot instead of a line graph? I think it has something to do with this line but I dont know what ax=ax does.

data.plot(ax=ax)

Here is my code:

#import libraries
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline
from matplotlib.dates import MO, TU, WE, TH, FR, SA, SU

#read data from csv selecting columns inline
data = pd.read_csv('EURCHF_Daily.csv', skipinitialspace=True,parse_dates=['Date'])
#set date as index
data.set_index('Date',inplace=True)
data = data.loc['2019/11/5':'2019/12/30']
#data = data[['Open','High','Low','Last']]
#data['High_Low_Mean'] = data['High'] - data['Low']
data = data[['Last']]

#plot data
fig, ax = plt.subplots(figsize=(15,7))
data.plot(ax=ax)
ax.tick_params(axis='x', colors='White',rotation=90)
ax.tick_params(axis='y', colors='White')
plt.style.use('seaborn-paper')

#set ticks every week
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=(MO, TU, WE, TH, FR,)))
#set major ticks format
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %d'))
0

3 Answers 3

1

The plot() function of a pandas DataFrame (which your data object is) uses a line plot by default.

You can use DataFrame.plot.scatter(x, y) to create a scatter plot of your data. The arguments x and y specify the columns of the DataFrame that will be used as the plot's X- and Y-axis.

See the documentation for more details: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.scatter.html

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you for your answer. Can I pre-format the 'Date' column from the dataframe so that when it is added to the graph, I get a shortened date version?
Did you leave in the 'ax=ax' parameter in your call of data.plot.scatter()? It tells matplotlib which axis to use for the plot - only this way the formatter will apply and the dates will be formatted correctly. I recommend you reading the documentations of matplotlib and pandas to get a better understanding of how they work.
1

You can directly add plt.scatter(x, y) to your code where x and y are the columns of Dataframe. It will generate the proper graph as per your requirement. Also put the code plt.show() to show the graph.

See for more details: https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.scatter.html

1 Comment

Thank you for answering. The only problem with this is that I don't know how to modify the 'date' column with 'set_major_formatter'
1

Here is a way using scatter from the standard matplotlib, setting the date (the index of the dataframe) as x and the closing value as y. As the default xlim is much too wide in this case, the code sets it using the first and last date.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.dates import MO, TU, WE, TH, FR

dates = ['2019-12-02', '2019-12-03', '2019-12-04', '2019-12-05', '2019-12-06', '2019-12-09', '2019-12-10',
         '2019-12-11', '2019-12-12', '2019-12-13', '2019-12-16', '2019-12-17', '2019-12-18', '2019-12-19',
         '2019-12-20', '2019-12-23', '2019-12-24', '2019-12-25', '2019-12-26', '2019-12-27', '2019-12-30',
         '2019-12-31']
close = [1.0981, 1.0936, 1.0957, 1.0954, 1.0943, 1.0930, 1.0913, 1.0936, 1.0958, 1.0937, 1.0950, 1.0929, 1.0898,
         1.0877, 1.0880, 1.0889, 1.0866, 1.0880, 1.0889, 1.0881, 1.0849, 1.0853]

data = pd.DataFrame({'Close': close}, index=pd.to_datetime(dates))

fig, ax = plt.subplots(figsize=(15,7))
plt.scatter(data.index, data.Close, color='crimson')
ax.tick_params(axis='x', colors='black', rotation=90)
ax.tick_params(axis='y', colors='black')
ax.set_xlim(data.index[0] - pd.offsets.Hour(12), data.index[-1]+ pd.offsets.Hour(12))
#set ticks every week
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=(MO, TU, WE, TH, FR)))
# set major ticks format
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %d'))
# automatically set the padding to fit everything
plt.tight_layout()
plt.show()

example plot

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.