'plotting with subplots in a loop

z = {'A': [0.3618426, 0.36146951], 'B': [1.8908799, 1.904695], 'C': [2.1813462e+08, 2.1833622e+08], 'D': [0.89925492, 0.89953589], 'E': [2.6356747, 2.6317911], 'F': [2.2250445e+08, 2.2501808e+08], 'G': [2.0806053e+08, 2.0691238e+08], 'H': [0.37242803, 0.37611806]}
k = [1,2]

for key in z:
plt.subplot(4,4,1)
plt.plot(k,[z[key][0],z[key][1]], 'ro-')
plt.show()

I will try to be clear. z is a dictionary which varies in size. What I would like to do is plot the dictionary quantities say 4 columns but the rows should increase based on how many plots are being generated, for examples if there are 16 keys to plot I should end up with a 4 row 4 column figures.How can I do this?



Solution 1:[1]

The basic form of drawing multiple graphs is the following method As a prerequisite, you need to decide on just the number of columns. cols=3 The rest of the looping process is completed by the number of dictionaries.

import matplotlib.pyplot as plt
import pandas as pd
import math

z = {'A': [0.3618426, 0.36146951], 'B': [1.8908799, 1.904695], 'C': [2.1813462e+08, 2.1833622e+08], 'D': [0.89925492, 0.89953589], 'E': [2.6356747, 2.6317911], 'F': [2.2250445e+08, 2.2501808e+08], 'G': [2.0806053e+08, 2.0691238e+08], 'H': [0.37242803, 0.37611806]}
k = [1,2]

cols = 3
rows = math.ceil(len(z) / cols)

fig, axes = plt.subplots(rows, cols, figsize=(16,12))

dict_keys = [k for k in z.keys()]

l = 0
for i in range(rows):
    for j in range(cols):
        if len(z) == l:
            break
        else:
            key = dict_keys[i+j]
            axes[i][j].plot(k, [z[key][0],z[key][1]], 'ro-')
        l += 1

plt.show()

enter image description here

Solution 2:[2]

@r-beginners' answer is perfect if no duplicated subplots. I made two minor modifications:

import matplotlib.pyplot as plt
import math

z = {'A': [0.3618426, 0.36146951], 'B': [1.8908799, 1.904695], 'C': [2.1813462e+08, 2.1833622e+08], 'D': [0.89925492, 0.89953589],
     'E': [2.6356747, 2.6317911], 'F': [2.2250445e+08, 2.2501808e+08], 'G': [2.0806053e+08, 2.0691238e+08], 'H': [0.37242803, 0.37611806]}
k = [1, 2]

cols = 3
rows = math.ceil(len(z) / cols)

fig, axes = plt.subplots(rows, cols, figsize=(16, 12))

dict_keys = [m for m in z.keys()]

l = 0
for i in range(rows):
    for j in range(cols):
        if len(z) == l:
            break
        else:
            key = dict_keys[l]      # modified
            axes[i][j].plot(k, [z[key][0], z[key][1]], 'ro-')
            l += 1          # modified

plt.show()

Solution 3:[3]

Here is a code which may help you:

from math import ceil

# 9 elements in my dict (4x4 + 1)
z = {'A': [0.3618426, 0.36146951], 'B': [1.8908799, 1.904695], 'C': [2.1813462e+08, 2.1833622e+08], 'D': [0.89925492, 0.89953589], 'E': [2.6356747, 2.6317911], 'F': [2.2250445e+08, 2.2501808e+08], 'G': [2.0806053e+08, 2.0691238e+08], 'H': [0.37242803, 0.37611806], 'X': [0.37242803, 0.37611806]}
k = [1,2]

plt.subplots(figsize=(16,8)) # optional

# fixed number of columns
cols = 4
# number of rows, based on cols
rows = ceil(len(z) / cols)

# iterate through indices and keys
for index, key in enumerate(z):
    # new subplot with (i + 1)-th index laying on a grid
    plt.subplot(rows, cols, index + 1) 
    # drawing the plot
    plt.plot(k, [z[key][0], z[key][1]], 'ro-')

# render everything
plt.show()

enter image description here

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 r-beginners
Solution 2 Jianbo Zhang
Solution 3