我尝试了以下操作,但这给出了错误的结果-子图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']
)
正确的结果应该在Y轴上的所有字母-a,b,d,e,f最好顺序排列,并且散点图的点应正确放置。
谢谢!
答案 0 :(得分:2)
如果a
和c
列的值是唯一的,则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.setdiff1d
和append
和sort_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']
)
答案 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()
结果图: