[英]Multiple figures with subplots from a dataframe
我有一个 dataframe ,我将列中的排序值绘制为一条线,然后沿着这条线绘制和标记各种百分位数。
我希望每个图有 12 个子图,并且根据列数(这将因我的真实数据集而异),我需要尽可能多的图。
这是我的脚本的一个版本,带有一个简单的 dataframe。 此示例生成 2 个图形,每个图形有 12 个子图。 dataframe 中只有 17 个条目,因此一个图有 7 个 emply 子图。 这是我需要的结果,但是,脚本并不优雅且效率不高。
我正在学习 python 并且当我无法弄清楚有效的 python 方式时倾向于恢复旧的脚本习惯。 有人可以告诉我如何用更优雅的 python 生成相同的数字吗? 如果我没有 7 个空的子图,那也很好。 我尝试了各种组合。 我想我因不了解pandas
与numpy
的内部工作原理而感到困惑。 我有一个 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
略有不同的方法
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.