python - python浓缩重复代码和子图
问题描述
我如何压缩这些代码行并说,如果我想分别绘制所有 3 个图,我该如何使用 matplotlib subplot 函数来做到这一点?以下是我所做的,但不确定如何压缩它:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
sns.set()
totalpop = 18000
subpop = [300, 400, 500]
samplesize_list1 = [10, 20, 30] #sample size 60
samplesize_list2 = [40, 50, 60] #sample size 150
samplesize_list3 = [70, 80, 90] #sample size 240
label_list = ['size60', 'size150', 'size240']
std_list = [300, 500, 700]
mean_list = [450, 670, 780]
repeat = 500 #repeated random sampling of 500 sampling outcomes
samplingdist1 = []
for i in range(500):
sample1 = []
for i in range(len(samplesize_list1)):
for j in range(samplesize_list1[i]):
s = 0
while True:
s = np.random.normal(mean_list[i], std_list[i], 1).tolist()
if s[0] > 0:
break
sample1 += s
samplingdist1.append(np.median(sample1))
sns.distplot(samplingdist1, label = 'size60')
samplingdist2 = []
for i in range(500):
sample2 = []
for i in range(len(samplesize_list2)):
for j in range(samplesize_list2[i]):
s = 0
while True:
s = np.random.normal(mean_list[i], std_list[i], 1).tolist()
if s[0] > 0:
break
sample2 += s
samplingdist2.append(np.median(sample2))
sns.distplot(samplingdist2, label = 'size150')
samplingdist3 = []
for i in range(500):
sample3 = []
for i in range(len(samplesize_list3)):
for j in range(samplesize_list3[i]):
s = 0
while True:
s = np.random.normal(mean_list[i], std_list[i], 1).tolist()
if s[0] > 0:
break
sample3 += s
samplingdist3.append(np.median(sample3))
sns.distplot(samplingdist3, label = 'size240')
我从中得到的图表被绘制在一个图表中,假设我想分别绘制它们并分别标记它'size60''size150''size240'。我该如何处理?
解决方案
这是为您提供的精简解决方案,并在评论中添加了简要说明
# Put your imports here
totalpop = 18000
subpop = [300, 400, 500]
samplesize_list = [[10, 20, 30], [40, 50, 60],[70, 80, 90]] # 3 lists combined into one
# Your label, std, mean and repeat data here
fig = plt.figure(figsize=(13, 3))
axes = fig.subplots(nrows=1, ncols=3) # Create a figure with 3 columns and 1 row
for ind, ax in enumerate(axes.flatten()): # Enumerate here to access index for samplesize
samplingdist = []
for i in range(500):
sample = []
for i in range(len(samplesize_list[ind])): # ind accesses the corresponding sublist
for j in range(samplesize_list[ind][i]):
s = 0
while True:
s = np.random.normal(mean_list[i], std_list[i], 1).tolist()
if s[0] > 0:
break
sample += s
samplingdist.append(np.median(sample))
sns.distplot(samplingdist, label = label_list[ind], ax=ax) # Pass the subplot ax for plotting
ax.legend() # Show the legend
输出
推荐阅读
- hyperledger-fabric - Hyperledger Fabric:configtx.yaml 中的 MSPDir 与 ORDERER_GENERAL_LOCALMSPDIR
- c# - WPF 托管 winforms 控件 - 仅在窗口或控件调整大小时重新计算高度
- python - set() 函数算法和“&”运算符一起使用时的复杂性
- pdf - 将带有html代码的String转换为Pdf格式,像Document的一段一样填充一个itext元素,用itext5,xmlworker
- r - 如何制作适用于两个系统的 .R/Makevars 文件?
- python - 按标签选择并写入 csv
- ubuntu - 如何返回未找到域的服务器但允许子目录正常显示
- xamarin - 如何在 Camera2Basic api 中获取图像的文件路径?
- wpf - 如何在给定时间跨度后从 Dispatch.Invoke 返回
- python - 为自定义 django 模块定义默认应用程序设置的最佳实践?