繁体   English   中英

带有来自 dataframe 的子图的多个数字

[英]Multiple figures with subplots from a dataframe

我有一个 dataframe ,我将列中的排序值绘制为一条线,然后沿着这条线绘制和标记各种百分位数。

我希望每个图有 12 个子图,并且根据列数(这将因我的真实数据集而异),我需要尽可能多的图。

这是我的脚本的一个版本,带有一个简单的 dataframe。 此示例生成 2 个图形,每个图形有 12 个子图。 dataframe 中只有 17 个条目,因此一个图有 7 个 emply 子图。 这是我需要的结果,但是,脚本并不优雅且效率不高。

我正在学习 python 并且当我无法弄清楚有效的 python 方式时倾向于恢复旧的脚本习惯。 有人可以告诉我如何用更优雅的 python 生成相同的数字吗? 如果我没有 7 个空的子图,那也很好。 我尝试了各种组合。 我想我因不了解pandasnumpy的内部工作原理而感到困惑。 我有一个 pandas Dataframe,但我正在使用 numpy 函数操作列。 在我的试验中,我在尝试将np.sort应用于 dataframe 列时遇到了很多错误,这就是为什么我恢复到一次从 dataframe 中取出一列来操作然后 Z32FA6E3Z.560566

df = pd.DataFrame(np.random.randint(0,100,size=(15, 17)), columns=list('ABCDEFGHIJKLMNOPQ'))
p = np.array([0.0, 25.0, 50.0, 75.0, 90.0, 95.0, 99.0, 100.0])
j=2
i=1
fig, axs = plt.subplots(4,3, figsize=(8.5, 11), facecolor='w', edgecolor='k')
fig.subplots_adjust(hspace=0.4, wspace=0.4)
for f in df.columns:
    d=df[f]
    d=np.sort(d)
    perc = np.nanpercentile(d, p)
    if i >12:
       fig, axs = plt.subplots(4,3, figsize=(8.5, 11), facecolor='w', edgecolor='k')
       i=1
       j=j+1
    plt.subplot(4, 3, i)
    plt.plot(d)
    plt.plot((len(df[f])-1) * p/100., perc, 'ro')
    plt.xticks((len(df[f])-1)* p/100., map(str, p))
    plt.show()
    i=i+1

略有不同的方法

  • 预先创建所有图形和轴并展平轴数组
  • 然后使用更多最新的 Matplotlib API 到plot对轴
  • 使用pandas而不是numpy因为我发现从系列索引而不是数组定义x坐标更简单
  • 即使在旋转之后,x 轴仍然有些难看,因为您想要 90+ 百分位的刻度接近
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import math

df = pd.DataFrame(np.random.randint(0,100,size=(15, 17)), columns=list('ABCDEFGHIJKLMNOPQ'))
p = np.array([0.0, 25.0, 50.0, 75.0, 90.0, 95.0, 99.0, 100.0])

# create all the figures and axis that are going to be used...
axs = np.array([])
for _ in range(math.ceil(len(df.columns)/12)):
    fig, ax_t = plt.subplots(4,3, figsize=(8.5, 11), facecolor='w', edgecolor='k')
    fig.subplots_adjust(hspace=0.4, wspace=0.4)
    axs = np.concatenate((axs, np.array(ax_t).flatten()))

for i, ax in enumerate(np.array(axs)):
    # NB will have created empty axis where there is no column
    if i==len(df.columns): break
    d = df.loc[:,df.columns[i]].sort_values().reset_index(drop=True)
    ax.plot(d.index/(len(df)-1), d)
    q = d.quantile(p/100)
    ax.plot(q, "ro")
    ax.set_xticks(p/100)
    ax.tick_params(axis='x', labelrotation = 90)
    # annotate 0th, 50th and 100th percentiles
    for a in q.loc[[0,.5,1]].index:
        ax.annotate(round(q[a],1), xy=(a, q[a]),  xycoords='data', xytext=(3, 3), textcoords='offset points',)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM