Matplotlib上的共享分类Y轴

时间:2018-12-23 14:55:29

标签: python pandas matplotlib

我尝试了以下操作,但这给出了错误的结果-子图1的Y标签被子图2的Y标签错误地覆盖。

import pandas as pd
import matplotlib.pyplot as plt

ab = {
   'a': ['a','b','a','b'],
   'b': [1,2,3,4]
}
ab = pd.DataFrame(ab)

cd = {
   'c': ['e','e','f','d'],
   'd': [1,2,3,4]
}
cd = pd.DataFrame(cd)


fig, axs = plt.subplots(
   1, 2,
   figsize = (15, 5), 
   sharey = True,
   sharex = True
)
axs[0].scatter(
   ab['b'], 
   ab['a']
)
axs[1].scatter(
   cd['d'],
   cd['c']
)

enter image description here

正确的结果应该在Y轴上的所有字母-a,b,d,e,f最好顺序排列,并且散点图的点应正确放置。

谢谢!

3 个答案:

答案 0 :(得分:2)

如果ac列的值是唯一的,则reindex可以通过以下两者的结合来实现:

cats = np.union1d(ab['a'], cd['c'])
ab = ab.set_index('a').reindex(cats)
cd = cd.set_index('c').reindex(cats)

然后绘制index es列:

# print(dfFormationSets4.head())
fig, axs = plt.subplots(
   1, 2,
   figsize = (15, 5), 
   sharey = True,
   sharex = True
)
axs[0].scatter(
   ab['b'], 
   ab.index
)
axs[1].scatter(
   cd['d'],
   cd.index
)

如果不需要唯一值,请使用numpy.setdiff1dappendsort_values来添加缺少的类别:

ab = {
   'a': ['a','b','a','b'],
   'b': [1,2,3,4]
}
ab = pd.DataFrame(ab)

cd = {
   'c': ['e','e','f','d'],
   'd': [1,2,3,4]
}
cd = pd.DataFrame(cd)

cats = np.union1d(ab['a'], cd['c'])
print (cats)
['a' 'b' 'd' 'e' 'f']

ab1 = pd.DataFrame({'a': np.setdiff1d(cats, ab['a'].unique())})
ab = ab.append(ab1, ignore_index=True).sort_values('a')
print (ab)
   a    b
0  a  1.0
2  a  3.0
1  b  2.0
3  b  4.0
4  d  NaN
5  e  NaN
6  f  NaN

cd1 = pd.DataFrame({'c': np.setdiff1d(cats, cd['c'].unique())})
cd = cd.append(cd1, ignore_index=True).sort_values('c')
print (cd)
   c    d
4  a  NaN
5  b  NaN
3  d  4.0
0  e  1.0
1  e  2.0
2  f  3.0

fig, axs = plt.subplots(
   1, 2,
   figsize = (15, 5), 
   sharey = True,
   sharex = True
)
axs[0].scatter(
   ab['b'], 
   ab['a']
)
axs[1].scatter(
   cd['d'],
   cd['c']
)

graph

答案 1 :(得分:0)

由于y轴类别不同,因此发生了这种情况。我已经检查了它们是否在两个数据帧中类别('a'等)的值相同。来自matplotlib subplot man page

  

当子图沿列具有共享的x轴时,仅x刻度   底部子图的标签已创建。同样,当子图时   沿行有一个共享的y轴,只有第一个的y刻度标签   列子图已创建。

在这种情况下,这就是发生的情况。我不确定分类值是否不匹配,那么matplotlib可以选择哪些作为刻度标签。

答案 2 :(得分:0)

您可以欺骗轴来绘制数值并手动更改标签:

# Imports and data

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

ab = {
   'a': ['a','b','a','b'],
   'b': [1,2,3,4]
}
ab = pd.DataFrame(ab)

cd = {
   'c': ['e','e','f','d'],
   'd': [1,2,3,4]
}
cd = pd.DataFrame(cd)

# from categorical to numerical
idx = {j:i for i,j in enumerate(np.unique(list(ab['a']) + list(cd['c'])))}

fig, axs = plt.subplots(
   1, 2,
   figsize = (15, 5), 
   sharey = True,
   sharex = True
)

# correct ticks
axs[0].set_yticks(range(len(idx)))
axs[0].set_yticklabels(idx.keys())

axs[0].scatter(
   ab['b'], 
   [idx[i] for i in ab['a']] # plot numerical
)
axs[1].scatter(
   cd['d'],
   [idx[i] for i in cd['c']] # plot numerical
)

plt.show()

结果图:

enter image description here