4

I have two dataframe with the same columns but different content. I have plotted dffinal data frame. now I want to plot another dataframe dffinal_no on the same diagram to be comparable.

for example one bar chart in blue colour, and the same bar chart with another colour just differentiating in y-axis.

This is part of the code in which I have plotted the first data frame.

dffinal = df[['6month','final-formula','numPatients6month']].drop_duplicates().sort_values(['6month'])

ax=dffinal.plot(kind='bar',x='6month', y='final-formula')
import matplotlib.pyplot as plt
ax2 = ax.twinx()
dffinal.plot(ax=ax2,x='6month', y='numPatients6month')
plt.show()

Now imagine I have another dffinal_no data frame with the same columns, how can I plot it in the same diagram?

This is my first diagram which I plotted, I want the other bar chart on this diagram with another color.

enter image description here

so the answer of @Mohamed Thasin ah is somehow what I want, except that the right y-axis is not correct.

I want both data frame be based on (6month, final-formula) but the right y-axis is just showing number of patients, as an information for the user.

Actually, I DO NOT want the first df based on final-fomula and the second df be based on NumberPatients.

Update1 jast as a refrence how it looks like my data frame

dffinal = df[['6month','final-formula','numPatients6month']].drop_duplicates().sort_values(['6month'])
nocidffinal = nocidf[['6month','final-formula','numPatients6month']].drop_duplicates().sort_values(['6month'])
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()
ax1.set_ylabel('final-formula')
ax2.set_ylabel('numPatients6month')
width=0.4
nocidffinal=nocidffinal.set_index('6month').sort_index()
dffinal=dffinal.set_index('6month').sort_index()
nocidffinal['final-formula'].plot(kind='bar',color='green',ax=ax1,width=width,position=0)
dffinal['numPatients6month'].plot(kind='bar',color='red',ax=ax2,width=width,position=1)

dffinal content

,6month,final-formula,numPatients6month
166047.0,1,7.794117647058823,680
82972.0,2,5.720823798627003,437
107227.0,3,5.734767025089606,558
111330.0,4,4.838709677419355,434
95591.0,5,3.3707865168539324,534
95809.0,6,3.611738148984198,443
98662.0,7,3.5523978685612785,563
192668.0,8,2.9978586723768736,467
89460.0,9,0.9708737864077669,515
192585.0,10,2.1653543307086616,508
184325.0,11,1.727447216890595,521
85068.0,12,1.0438413361169103,479

nocidffinal

,6month,final-formula,numPatients6month
137797.0,1,3.5934291581108826,974
267492.0,2,2.1705426356589146,645
269542.0,3,2.2106631989596877,769
271950.0,4,2.0,650
276638.0,5,1.5587529976019185,834
187719.0,6,1.9461077844311379,668
218512.0,7,1.1406844106463878,789
199830.0,8,0.8862629246676514,677
269469.0,9,0.3807106598984772,788
293390.0,10,0.9668508287292817,724
254783.0,11,1.2195121951219512,738
300974.0,12,0.9695290858725761,722
sariii
  • 2,020
  • 6
  • 29
  • 57
  • https://stackoverflow.com/questions/32280490/how-to-make-multiple-bar-plots-one-within-another-using-matplotlib-pyplot – inspired_learner Jun 18 '18 at 15:40
  • Thanks for the response, Actually its very simple case compared with mine. but I will give it a try and let you know :) – sariii Jun 18 '18 at 15:51
  • @inspired_learner thanks for the response, sadly I could not apply that sample to my case. mine is with pandas and I already have two axis. please let me know if you need more information. cheers to the response – sariii Jun 18 '18 at 16:13

1 Answers1

10

to compare two data frame result with bar plot one way you could try is concatenating two data frames and adding hue. For example consider below df it contains same x and y columns in both df's and wanna compare this values. to achieve this simply add hue column for each df with differentiating constant like below.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df1=pd.DataFrame({'x':[1,2,3,4,5],'y':[10,2,454,121,34]})
df2=pd.DataFrame({'x':[4,1,2,5,3],'y':[54,12,65,12,8]})
df1['hue']=1
df2['hue']=2
res=pd.concat([df1,df2])
sns.barplot(x='x',y='y',data=res,hue='hue')
plt.show()

The result should looks like below:

enter image description here

To get two y-axis try this method,

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()

ax1.set_ylabel('final-formula')
ax2.set_ylabel('numPatients6month')

width=0.4

df1=df1.set_index('x').sort_index()
df2=df2.set_index('x').sort_index()

df1['y'].plot(kind='bar',color='blue',ax=ax1,width=width,position=1)
df2['y'].plot(kind='bar',color='green',ax=ax2,width=width,position=0)
plt.show()

enter image description here

with actual input:

fig = plt.figure()

ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()

ax1.set_ylabel('final-formula')
ax2.set_ylabel('numPatients6month')


width=0.4

df1=df1.set_index('6month').sort_index()
df2=df2.set_index('6month').sort_index()

df1['final-formula'].plot(kind='bar',color='blue',ax=ax1,width=width,position=1)
df2['numPatients6month'].plot(kind='bar',color='green',ax=ax2,width=width,position=0)
plt.show()

enter image description here

Mohamed Thasin ah
  • 10,754
  • 11
  • 52
  • 111
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/173415/discussion-between-mohamed-thasin-ah-and-saria-goudarzi). – Mohamed Thasin ah Jun 19 '18 at 16:35
  • 1
    while your answer really helped me I still need it in a way it should have the both y-axis. so I am unmarking your answer as the desired answer in the hope someone help me with that part – sariii Jun 21 '18 at 16:21
  • I see thanks for that. however I think its not possible to have the right y-axis as I was explaining becaz of ratio, 10/1000 is the same as 1/100, so if two bar are the same according to left y-axis, they might not be the same in the right, so I changed my mind to show each numberofPatients on above each bar, Is it possible? – sariii Jun 21 '18 at 20:57