-1

I am trying to plot a line over a bar chart, but when I plotted the line the bar chart disappeared - and so did my x index values. Can anyone help me plot the line and the bar in the same figure? Thank you. My problem, I believe, is that the line and bar charts are overuling each other - but I want them to coexist.

plt.figure()
totalconfirm['Cases'].plot(kind='bar', rot=15, title="Cases per Day in all Michigan Counties", color='r', label = 'Confirmed Cases')
totalprob['Cases'].plot(kind = 'bar', rot=15, bottom=totalconfirm['Cases'], color = 'b', label = 'Probable Cases')
totalconfirm['Deaths'].plot(color = 'black', label = 'Deaths')

ax = plt.gca()
ax.xaxis.set_major_locator(plt.MaxNLocator(10)) 

ax.text(0.05, 0.95, "Total Tests: " + str(totaltotaltest), fontsize=10, transform=ax.transAxes,
        verticalalignment='top', bbox = dict(boxstyle='round', facecolor='wheat', alpha=0.5))

ax.set_xticklabels(df.index.format(), rotation='vertical', size=5)
plt.locator_params(axis='x', nbins=30)

plt.legend(loc="upper right")
plt.show()

Additionally, how would I move this text box to the right side under the legend?

enter image description here

Have looked at matplotlib plot bar and line charts together, Pandas plot bar chart over line it didn't cover what I wanted I think.

Datasets:

Date
2020-03-01     0
2020-03-02     0
2020-03-03     0
2020-03-04     0
2020-03-05     0
2020-03-06     0
2020-03-07     0
2020-03-08     0
2020-03-09     0
2020-03-10     0
2020-03-11     0
2020-03-12     0
2020-03-13     0
2020-03-14     0
2020-03-15     0
2020-03-16     1
2020-03-17     0
2020-03-18     3
2020-03-19     5
2020-03-20     2
2020-03-21     8
2020-03-22    13
2020-03-23    21
2020-03-24    25
2020-03-25    24
2020-03-26    46
2020-03-27    49
2020-03-28    66
2020-03-29    62
2020-03-30    80
              ..
2020-06-19    11
2020-06-20     8
2020-06-21     8
2020-06-22    14
2020-06-23     9
2020-06-24     6
2020-06-25     8
2020-06-26     6
2020-06-27    11
2020-06-28     7
2020-06-29     7
2020-06-30     6
2020-07-01     7
2020-07-02    10
2020-07-03     9
2020-07-04     6
2020-07-05     5
2020-07-06     7
2020-07-07    10
2020-07-08     7
2020-07-09     8
2020-07-10     5
2020-07-11     7
2020-07-12     6
2020-07-13     4
2020-07-14     0
2020-07-15     6
2020-07-16     2
2020-07-17     3
2020-07-18     0
Name: Deaths, dtype: int64
Date
2020-03-01      14
2020-03-02      13
2020-03-03      22
2020-03-04      24
2020-03-05      26
2020-03-06      41
2020-03-07      48
2020-03-08      63
2020-03-09     122
2020-03-10     155
2020-03-11     200
2020-03-12     269
2020-03-13     360
2020-03-14     364
2020-03-15     462
2020-03-16     702
2020-03-17     766
2020-03-18     861
2020-03-19     738
2020-03-20     933
2020-03-21     784
2020-03-22     793
2020-03-23    1208
2020-03-24    1075
2020-03-25    1160
2020-03-26    1128
2020-03-27    1289
2020-03-28    1041
2020-03-29     893
2020-03-30    1532
              ... 
2020-06-19     285
2020-06-20     189
2020-06-21     227
2020-06-22     398
2020-06-23     441
2020-06-24     419
2020-06-25     386
2020-06-26     368
2020-06-27     296
2020-06-28     304
2020-06-29     482
2020-06-30     481
2020-07-01     539
2020-07-02     470
2020-07-03     397
2020-07-04     273
2020-07-05     374
2020-07-06     605
2020-07-07     554
2020-07-08     607
2020-07-09     509
2020-07-10     478
2020-07-11     276
2020-07-12     280
2020-07-13     513
2020-07-14     382
2020-07-15     312
2020-07-16     228
2020-07-17     141
2020-07-18       8
Name: Cases, dtype: int64
MikaO13
  • 15
  • 1
  • 7

1 Answers1

2

I have done this using plotly. I have modified the Deaths to increase the value so that the line graph is seen.

DataFrame:

 Date  Deaths  Cases
0   2020-03-01       5     14
1   2020-03-02       3     13
2   2020-03-03       6     22
3   2020-03-04       9     24
4   2020-03-05       5     26
5   2020-03-06       2     41
6   2020-03-07      10     28
7   2020-03-08       2     63
8   2020-03-09      10    122
9   2020-03-10      15    155
10  2020-03-11      20    200
11  2020-03-12      15    269
12  2020-03-13      20    360
13  2020-03-14      30    364
14  2020-03-15      40    462
15  2020-03-16     150    702
16  2020-03-17      70    766
17  2020-03-18      50    861
18  2020-03-19      30    738
19  2020-03-20     100    933
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import pandas as pd
import numpy as np

df = pd.read_csv("a.csv")
fig = make_subplots(1,1)

fig.add_trace(go.Bar(x=df['Date'], y=df['Cases'],
                     name='Cases',
                     marker_color = 'yellow',
                     opacity=0.4,
                     marker_line_color='rgb(8,48,107)',
                     marker_line_width=2),
              row = 1, col = 1)

fig.add_trace(go.Scatter(x=df['Date'], y=df['Deaths'], line=dict(color='red'), name='Deaths'),
              row = 1, col = 1)

fig.show()

Diagram: enter image description here

Using pandas plotting

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("a.csv")

fig, ax = plt.subplots(figsize = (15,8))
df.plot(x = 'Date', y = ['Deaths'], kind = 'line', ax = ax)
df.plot(x = 'Date', y= ['Cases'], kind = 'bar', ax = ax, colormap="RdYlBu")

enter image description here

Update: To use Date as index

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("a.csv")
df.set_index("Date", inplace=True)

fig, ax = plt.subplots(figsize = (15,8))
df.plot( y = ['Deaths'], kind = 'line', ax = ax)
df.plot( y= ['Cases'], kind = 'bar', ax = ax, colormap="RdYlBu")

Dataframe with Date as index. Plotting this will give the same plot as above.

            Deaths  Cases
Date
2020-03-01       5     14
2020-03-02       3     13
2020-03-03       6     22
2020-03-04       9     24
2020-03-05       5     26
2020-03-06       2     41
2020-03-07      10     28
2020-03-08       2     63
2020-03-09      10    122
2020-03-10      15    155
2020-03-11      20    200
2020-03-12      15    269
2020-03-13      20    360
bigbounty
  • 16,526
  • 5
  • 37
  • 65