基于matplotlib的Pandas动态子图

deikduxw  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(108)

我需要帮助在matplotlib中从Pandas Dataframe 动态创建子图。我使用的数据来自data.word
我已经创建了viz,但图为have been created manually

我之所以需要它动态的原因是因为我将动态地应用一个过滤器(在Power BI中),我需要图形来调整过滤器。
这是我目前所知道的:我导入了数据,并得到了我需要的形状:

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

# read file from makeover monday year 2018 week 48
df = pd.read_csv(r'C:\Users\Ruth Pozuelo\Documents\python_examples\data\2018w48.csv',  usecols=["city", "category","item", "cost"], index_col=False, decimal=",")
df.head()

这是表:

然后,我动态应用来自Power BI的过滤器:

df = df[df.category=='Party night']

然后根据应用过滤器后获得的项目数计算绘图数量:

itemCount = df['item'].nunique()         #number of plots

如果我再绘制支线剧情:

fig, ax = plt.subplots( nrows=1, ncols=itemCount ,figsize=(30,10), sharey=True)

我把 backbone 拿过来:

到目前为止一切都很好!但是现在我正在研究如何将x轴输入到循环中来生成子类。我正在尝试下面的方法,但是没有任何效果。

#for i, ax in enumerate(axes.flatten()):
 #   ax.plot(??,cityValues, marker='o',markersize=25, lw=0, color="green") # The top-left axes

由于我已经有了图表的外观和感觉的代码,注解等,我希望能够使用plt.subplots方法,如果可能的话,我更喜欢不使用seborn。
有办法让他工作吗?
提前感谢!

6rvt4ljy

6rvt4ljy1#

数据呈现在我们面前,我们将其作为代码的基础。我准备了一个列列表和一个着色列表,并在它们之间循环。axes.rabel()比axes.fatten()内存效率更高。这是因为该列表包含每个子绘图区的一个对象,允许集中配置。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

url='https://raw.githubusercontent.com/Curbal-Data-Labs/Matplotlib-Labs/master/2018w48.csv'
dataset = pd.read_csv(url)

dataset.drop_duplicates(['city','item'], inplace=True)
dataset.pivot_table(index='city', columns='item', values='cost', aggfunc='sum', margins = True).sort_values('All', ascending=True).drop('All', axis=1)

df = dataset.pivot_table(index='city', columns='item', values='cost', aggfunc='sum', margins = True).sort_values('All', ascending=True).drop('All', axis=1).sort_values('All', ascending=False, axis=1).drop('All').reset_index()

# comma replace
for c in df.columns[1:]:
    df[c] = df[c].str.replace(',','.').astype(float)

fig, axes = plt.subplots(nrows=1, ncols=5, figsize=(30,10), sharey=True)

colors = ['green','blue','red','black','brown'] 
col_names = ['Dinner','Drinks at Dinner','2 Longdrinks','Club entry','Cinema entry']

for i, (ax,col,c) in enumerate(zip(axes.ravel(), col_names, colors)):
    ax.plot(df.loc[:,col], df['city'], marker='o', markersize=25, lw=0, color=c)
    ax.set_title(col)
    for i,j in zip(df[col], df['city']):
        ax.annotate('$'+str(i), xy=(i, j), xytext=(i-4,j), color="white", fontsize=8)
    ax.set_xticks([])
    ax.spines[['top', 'right', 'left', 'bottom']].set_visible(False)
    ax.grid(True, axis='y', linestyle='solid', linewidth=2)
    ax.grid(True, axis='x', linestyle='solid', linewidth=0.2)
    ax.xaxis.tick_top() 
    ax.xaxis.set_label_position('top')
    ax.set_xlim(xmin=0, xmax=160)
    ax.xaxis.set_major_formatter('${x:1.0f}')
    ax.tick_params(labelsize=8, top=False, left=False)

plt.show()

0yg35tkg

0yg35tkg2#

下面的工作示例。我使用seborn来绘制条形图,但想法是一样的,你可以循环遍历各个面并增加一个计数。从-1开始,使第一个计数= 0,并将其用作轴标签。

import seaborn as sns 

fig, ax = plt.subplots( nrows=1, ncols=itemCount ,figsize=(30,10), sharey=True)  

df['Cost'] = df['Cost'].astype(float) 
count = -1 
variables = df['Item'].unique() 

fig, axs = plt.subplots(1,itemCount , figsize=(25,70), sharex=False, sharey= False) 

for var in variables:
        count += 1 
        sns.barplot(ax=axs[count],data=df, x='Cost', y='City')

相关问题