Hi all,
First of all there isn't 27 attachments to this question there are 5.
I have made the question more concise so please do read again.
I am working on my first python project and this is my first time posting in a forum.
I am trying to write a function which plots individual country's inflation data against the years since inflation data was collected for said country (in years) in separate subplots within the same figure.
The issue I am having is either being able to plot the last country's inflation data on all subplots OR all countries inflation data on all subplots.
I am working on a Jupyter Notebook on the Anaconda platform.
QUESTION: How can I change this function so as to plot the first country's inflation data on the first subplot, the second country's inflation data on the second subplot, and so on.
The below code (ATTEMPT 1) returns 4 subplots, each subplot contains the 4 countries inflation data.
ATTEMPT 1
Attempt 2:
Attempt 3:
Attempt 4:
Attempt 5:
# This script attempts to code for a function "global_inf_subplots_func()" the aim of which is to plot multiple
# subplots. Each subplot should plot years 1960 - 2021 on the x axis, against subsequent countries inflation %
# on the y axis.
# The x axis data is from "x = df_transposed['years']", the years column from the transposed DataFrame:
# df_transposed.
# The y axis data is from the col _pos dictionary. This dictionary gives a number as a key and the respective
# countries inflation % data as a value.
# (Aim*) The overall aim of this function is to be able to plot years vs country (n) inflation data,
# each subsequent subplot containing the next countries inflation % data in the col_pos dictionary.
The DataFrame used in this code:
First of all there isn't 27 attachments to this question there are 5.
I have made the question more concise so please do read again.
I am working on my first python project and this is my first time posting in a forum.
I am trying to write a function which plots individual country's inflation data against the years since inflation data was collected for said country (in years) in separate subplots within the same figure.
The issue I am having is either being able to plot the last country's inflation data on all subplots OR all countries inflation data on all subplots.
I am working on a Jupyter Notebook on the Anaconda platform.
QUESTION: How can I change this function so as to plot the first country's inflation data on the first subplot, the second country's inflation data on the second subplot, and so on.
The below code (ATTEMPT 1) returns 4 subplots, each subplot contains the 4 countries inflation data.
ATTEMPT 1
# Subplots function with df_transposed dataframe ISSUE: returns subplots each plotting all selected country data. # This function takes in two arguments: "df" the DataFrame, and "df_col_range" the range of country columns # to plot. # This function uses the dictionary "col_pos" to access columns. # This code appears to plot p = 1-4, (1)Aruba, (2)Africa Eastern and Southern, (3)Afghanistan, (4)Africa Western # and Central. def global_inf_subplots_func(df, col_range_index): # col_pos creates a dictionary so as to be access columns by position (column index) col_pos = {df_transposed.columns.get_loc(c): c for idx, c in enumerate(df_transposed.columns)} x = df_transposed['years'] rows, cols = int(col_range_index/2), int(col_range_index/2) fig, ax = plt.subplots(rows, cols, figsize = (30, 30), sharex='col', sharey='row') for row in range(rows): for col in range(cols): for p in col_pos: if p != 0 and p < col_range_index: y = df_transposed.iloc[:, p] ax[row, col].plot(x, y) plt.show() global_inf_subplots_func(df_transposed, 5)
Output:
QUESTION: The below attempt (attempt 2) has the same goal (to plot 4 subplots, each subplot containing different country's inflation data. Instead, all 4 subplots have the last country of the 4 selected plotted.Attempt 2:
# Subplots function with df_transposed dataframe **** on each iteration, same y axis data is being plotted # I need the code to add the next iteration of the dataframes columns to be plotted on the next subplot, # then move onto the next # This function takes in four arguments: "df" the DataFrame, and "df_col_range" the range of country columns # to plot, "rows" the number of rows of subplots the figure needs to hold, "cols" the number of columns of # subplots the figure needs to hold. # This function used the dictionary "col_pos" to access columns. # This code appears to plot p = 4, (4) Africa Western and Central, ONLY - Explanation????: the first for loop, # Iterates over p = 1 to 4 and therefore p = 4 is the last return, # Therefore p = 4 is used in y = df_transposed.iloc[:, p] and is used in the subsequent subplots???? def global_inf_subplots_func(df, col_range_index, rows, cols): # col_pos creates a dictionary so as to be access columns by position (column index) col_pos = {df_transposed.columns.get_loc(c): c for idx, c in enumerate(df_transposed.columns)} x = df_transposed['years'] rows, cols = rows, cols fig, ax = plt.subplots(rows, cols, figsize = (30, 30), sharex='col', sharey='row') for p in col_pos: if p != 0 and p < col_range_index: y = df_transposed.iloc[:, p] for row in range(rows): for col in range(cols): ax[row, col].plot(x, y) plt.show() global_inf_subplots_func(df_transposed, 5, 2, 2)
Output:
QUESTION: Why does this function plot ALL countries inflation data on each subplot, when only the 4 (as previous) were selected.Attempt 3:
# Subplots function with df_transposed dataframe **** on each iteration, same y axis data is being plotted # I need the code to add the next iteration of the dataframes columns to be plotted on the next subplot, # then move onto the next # This function takes in four arguments: "df" the DataFrame, and "df_col_range" the range of country columns # to plot, "rows" the number of rows of subplots the figure needs to hold, "cols" the number of columns of # subplots the figure needs to hold. # This function used the dictionary "col_pos" to access columns. # This code appears to plot ALL countries, and therefore all columns # (eventhough only 4 countries (4 columns) selected from col_pos) def global_inf_subplots_func(df, col_range_index, rows, cols): # col_pos creates a dictionary so as to be access columns by position (column index) col_pos = {df_transposed.columns.get_loc(c): c for idx, c in enumerate(df_transposed.columns)} x = df_transposed['years'] rows, cols = rows, cols fig, ax = plt.subplots(rows, cols, figsize = (30, 30), sharex='col') for p in col_pos: if p != 0 and p > col_range_index: y = df_transposed.iloc[:,p] for row in range(rows): for col in range(cols): ax[row, col].plot(x, y) plt.show() global_inf_subplots_func(df_transposed, 5, 2, 2)
Output:
Just for information.... I have also tried to achieve the same with a different approach:Attempt 4:
def plot_global_inf_sub(): for c in df_transposed['Aruba':'Zimbabwe']: n = len(df_transposed.columns) -1 i = 0 a = 1 x = years fig, ax = plt.subplots(int(n/2), int(n/2)) while i >= n: ax[i,(i-i)].plot(x, c) ax[i, a(i=+1)].plot(x, c) y = df_transposed[c] plt.plot(x, y) plt.show() plot_global_inf_sub()No output to the above, In[*] occurs.
Attempt 5:
def plot_global_inf_sub(): n = len(df_transposed.columns) x = years p = 1 i = 0 for c in df_transposed.loc['Aruba':'Zimbabwe']: for p in range(n): for q in range(n): if i <= n: m = p(ax(p), ax(q)) fig, m = plt.subplots(int(n/2), int(n/2)) a = 1 y = df_transposed[c] ax[i,(i-i)].plot(x, y) ax[i, a(i=+1)].plot(x, y) plt.show() plot_global_inf_sub()
Error:---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/var/folders/7n/v1x237vx47z_7y3g2_63b64h0000gs/T/ipykernel_6003/2417806721.py in <module>
16 plt.show()
17
---> 18 plot_global_inf_sub()
/var/folders/7n/v1x237vx47z_7y3g2_63b64h0000gs/T/ipykernel_6003/2417806721.py in plot_global_inf_sub()
8 for q in range(n):
9 if i <= n:
---> 10 m = p(ax(p), ax(q))
11 fig, m = plt.subplots(int(n/2), int(n/2))
12 a = 1
TypeError: 'numpy.ndarray' object is not callable
Notes from script:# This script attempts to code for a function "global_inf_subplots_func()" the aim of which is to plot multiple
# subplots. Each subplot should plot years 1960 - 2021 on the x axis, against subsequent countries inflation %
# on the y axis.
# The x axis data is from "x = df_transposed['years']", the years column from the transposed DataFrame:
# df_transposed.
# The y axis data is from the col _pos dictionary. This dictionary gives a number as a key and the respective
# countries inflation % data as a value.
# (Aim*) The overall aim of this function is to be able to plot years vs country (n) inflation data,
# each subsequent subplot containing the next countries inflation % data in the col_pos dictionary.
The DataFrame used in this code:
df_transposed
Output:Country Name years Aruba Africa Eastern and Southern Afghanistan Africa Western and Central Angola Albania Andorra Arab World United Arab Emirates ... Virgin Islands (U.S.) Vietnam Vanuatu World Samoa Kosovo Yemen, Rep. South Africa Zambia Zimbabwe
1960 1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 1.288859 NaN NaN
1961 1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 2.102374 NaN NaN
1962 1962 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN 2.654867 NaN NaN 1.246285 NaN NaN
1963 1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN 0.689655 NaN NaN 1.337970 NaN NaN
1964 1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN 5.308219 NaN NaN 2.534973 NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2017 2017 -1.028282 6.399343 4.975952 1.764635 29.843587 2.060598 NaN 1.966826 1.966826 ... NaN 3.520257 3.084526 2.192010 1.749897 1.488234 NaN 5.184247 6.577312 0.893962
2018 2018 3.626041 4.720811 0.626149 1.784050 19.628608 2.028060 NaN 2.458142 3.068634 ... NaN 3.539628 2.330964 2.438737 4.197459 1.053798 NaN 4.517165 7.494572 10.618866
2019 2019 4.257462 4.120246 2.302373 1.758565 17.081215 1.411091 NaN 1.091848 -1.931081 ... NaN 2.795824 2.762520 2.186902 0.982327 2.675992 NaN 4.120246 9.150316 255.304991
2020 2020 NaN 5.404815 NaN 2.492522 NaN 1.620887 NaN 1.777408 -2.079403 ... NaN 3.220934 5.329351 1.920968 -1.568912 0.198228 NaN 3.210036 15.732585 557.201817
2021 2021 NaN 7.240978 NaN 3.925603 NaN 2.041472 NaN 3.243460 NaN ... NaN 1.834716 2.343284 3.423629 3.133205 3.353691 NaN 4.611672 22.021234 98.546105