Mubashir Raza
Mubashir Raza

Reputation: 153

How to pretty print labels on chart

I have this dataframe:

{'date': {0: Timestamp('2019-10-31 00:00:00'),
  1: Timestamp('2019-11-30 00:00:00'),
  2: Timestamp('2019-12-31 00:00:00'),
  3: Timestamp('2020-01-31 00:00:00'),
  4: Timestamp('2020-02-29 00:00:00'),
  5: Timestamp('2020-03-31 00:00:00'),
  6: Timestamp('2020-04-30 00:00:00'),
  7: Timestamp('2020-05-31 00:00:00'),
  8: Timestamp('2020-06-30 00:00:00'),
  9: Timestamp('2020-07-31 00:00:00'),
  10: Timestamp('2020-08-31 00:00:00')},
 'rate': {0: 100.0,
  1: 99.04595078851037,
  2: 101.09797599729458,
  3: 102.29581878702609,
  4: 104.72409825791058,
  5: 109.45297539163114,
  6: 118.24943699089361,
  7: 119.65432196709045,
  8: 117.82108184647535,
  9: 118.6223497519237,
  10: 120.32838345607335}}

When I plot it I get clogged x axis enter image description here

How do I print it such that I get a month name, year on x axis. For instance Nov,19.

I am using this to plot

chart = sns.lineplot('date', 'rate', data=cdf,marker="o")

If I add more datapoints it doesnt display them even if I change size: enter image description here

enter image description here

Data:

{'date': {0: Timestamp('2019-01-31 00:00:00'),
  1: Timestamp('2019-02-28 00:00:00'),
  2: Timestamp('2019-03-31 00:00:00'),
  3: Timestamp('2019-04-30 00:00:00'),
  4: Timestamp('2019-05-31 00:00:00'),
  5: Timestamp('2019-06-30 00:00:00'),
  6: Timestamp('2019-07-31 00:00:00'),
  7: Timestamp('2019-08-31 00:00:00'),
  8: Timestamp('2019-09-30 00:00:00'),
  9: Timestamp('2019-10-31 00:00:00'),
  10: Timestamp('2019-11-30 00:00:00'),
  11: Timestamp('2019-12-31 00:00:00'),
  12: Timestamp('2020-01-31 00:00:00'),
  13: Timestamp('2020-02-29 00:00:00'),
  14: Timestamp('2020-03-31 00:00:00'),
  15: Timestamp('2020-04-30 00:00:00'),
  16: Timestamp('2020-05-31 00:00:00'),
  17: Timestamp('2020-06-30 00:00:00'),
  18: Timestamp('2020-07-31 00:00:00')},
 'rate': {0: 100.0,
  1: 98.1580633244672,
  2: 102.03029115707123,
  3: 107.12429902683576,
  4: 112.60187555657997,
  5: 108.10306860500229,
  6: 105.35473845070196,
  7: 105.13286204895526,
  8: 106.11760178061557,
  9: 107.76819930852,
  10: 106.77041938461862,
  11: 108.84840098309556,
  12: 110.29751856107903,
  13: 112.93762886874026,
  14: 118.04947620270883,
  15: 127.80912766377679,
  16: 128.90556903738158,
  17: 126.96768455091889,
  18: 127.95060601426769}}

I have posted the updated data.

Upvotes: 0

Views: 157

Answers (1)

Andrew
Andrew

Reputation: 151

from pandas import Timestamp
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt


df = pd.DataFrame(
                 {'date':
                         {0: Timestamp('2019-10-31 00:00:00'),
                          1: Timestamp('2019-11-30 00:00:00'),
                          2: Timestamp('2019-12-31 00:00:00'),
                          3: Timestamp('2020-01-31 00:00:00'),
                          4: Timestamp('2020-02-29 00:00:00'),
                          5: Timestamp('2020-03-31 00:00:00'),
                          6: Timestamp('2020-04-30 00:00:00'),
                          7: Timestamp('2020-05-31 00:00:00'),
                          8: Timestamp('2020-06-30 00:00:00'),
                          9: Timestamp('2020-07-31 00:00:00'),
                          10: Timestamp('2020-08-31 00:00:00')},
                 'rate':
                         {0: 100.0,
                          1: 99.04595078851037,
                          2: 101.09797599729458,
                          3: 102.29581878702609,
                          4: 104.72409825791058,
                          5: 109.45297539163114,
                          6: 118.24943699089361,
                          7: 119.65432196709045,
                          8: 117.82108184647535,
                          9: 118.6223497519237,
                          10: 120.32838345607335}})


df['datelabel'] = df['date'].apply(lambda x: x.strftime('%b %d'))
chart = sns.lineplot('date', 'rate', data=df,marker="o")
chart.set_xticklabels(df.datelabel, rotation=45)
plt.show()

plt

Here's one approach: Build a lambda function to apply strftime with our target representations over each record in date.

For date formatting, see: https://strftime.org/

%b - Month as locale’s abbreviated name.
%d - Day of the month as a zero-padded decimal number.

We can save it as a set of reference labels to be applied to the chart via xticklabels.

Additionally, you can rotate the labels with the rotation parameter.

Upvotes: 2

Related Questions