[英]Grouped X-axis Variability plot in Python
我有一個數據集如下。 我想繪制一個變異圖,如 JMP 中的分組 X 軸,具有多個類別和逐行圖例。 JMP 的數據集和繪圖示例如下。 是否有繪制此類數據的 Pythonic 解決方案? 我正在尋找使用任何 python 繪圖庫的解決方案 - bokeh、matplotlib、seaborn 等,
你可以試試這個代碼,你需要修改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()
輸出圖表:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.