我有一个数据集,如下所示。我想绘制一个变异性图,如JMP中的分组X轴与多个类别和图例的行。数据集和图从JMP的例子如下。是否有一个Python的解决方案来绘制这种类型的数据?我正在寻找一个解决方案,使用任何Python绘图库- bokeh,matplotlib,seaborn等,
b4lqfgs41#
你可以试试这段代码,你需要修改plot的xlim和ylim参数以适合你的真实的数据:
xlim
ylim
import pandas as pd import matplotlib.pyplot as plt from itertools import groupby import numpy as np %matplotlib inline df = pd.DataFrame({'Name':['John']*2+['David']*2+['Mike']*2+['Albert']*2+['King']*2+['Brown']*2, 'TEST_Name':['Class A']*6+['Class B']*6, 'Label':['Median','NINETYFIVEPERC']*6, 'Data':[.54,.62,.55,.62,.55,.67,.58,1.05,.54,.60,.54,.60]}) df = df.set_index(['TEST_Name','Name','Label'])['Data'].unstack() def add_line(ax, xpos, ypos): line = plt.Line2D([xpos, xpos], [ypos + .1, ypos], transform=ax.transAxes, color='gray') line.set_clip_on(False) ax.add_line(line) def label_len(my_index,level): labels = my_index.get_level_values(level) return [(k, sum(1 for i in g)) for k,g in groupby(labels)] def label_group_bar_table(ax, df): ypos = -.1 scale = 1./df.index.size for level in range(df.index.nlevels)[::-1]: pos = 0 for label, rpos in label_len(df.index,level): lxpos = (pos + .5 * rpos)*scale ax.text(lxpos, ypos, label, ha='center', transform=ax.transAxes) add_line(ax, pos*scale, ypos) pos += rpos add_line(ax, pos*scale , ypos) ypos -= .1 ax = df.plot(marker='o', linestyle='none', xlim=(-.5,5.5), ylim=(.3,1.1)) #Below 2 lines remove default labels ax.set_xticklabels('') ax.set_xlabel('') label_group_bar_table(ax, df) # you may need these lines, if not working interactive # plt.tight_layout() # plt.show()
输出图表:
1条答案
按热度按时间b4lqfgs41#
你可以试试这段代码,你需要修改plot的
xlim
和ylim
参数以适合你的真实的数据:输出图表: