Pandas数据可视化完整指南(python)

文摘   2024-06-18 18:13   辽宁  
点击上方“进修编程”,选择“星标公众号

超级无敌干货,第一时间送达!!!

现在pandas在数据可视化中的地位举足轻重。这篇文章给大家讲述完整的pandas使用指南、大家可以收藏日后使用时查看即可。

数据分析师、数据科学家以及其他少数职业需要具备从数据中生成信息的能力。此过程涉及统计数据、数据挖掘技术、模型学习等的使用。还有一个非常关键的步骤,即数据可视化。为了有效地可视化数据,我们有多种工具,如 Tableau、Power BI 等。但是,python 库足以创建有吸引力、清晰且富有创意的可视化效果,以描绘对数据的深刻见解。为了做出重要的业务决策,企业通常更关心可视化,而不是可视化创建过程中涉及的数学和编码。作为开发人员,我们应该更加关注流程,例如编码,以便在不犯任何错误的情况下描绘清晰而重要的信息。我们在数据可视化方面的错误可能会导致错误的信息。因此,数据可视化非常重要。

好的,现在让我们开始吧。在这篇博客中,我不会使用 matplotlib(除了 subplot)。我将使用 Pandas,您将看到 Pandas 绘图非常漂亮,涵盖了大多数所需的图表。有高级的图表制作技术,但可以使用 seaborn 和 matplotlib 来完成。Pandas 库为重要的图表创建提供了一套很好的函数。这篇文章主要是实践性的,很少涉及理论。我们练习得越多,我们知道的就越多!让我们开始吧。

内容

  1. 线图

  2. 条形图

  3. 直方图

  4. 箱线图

  5. 面积图

  6. 散点图

  7. 六边形箱图

  8. 饼图

  9. 密度图

  10. Pandas 图表如何处理缺失数据!

  11. 结论

导入所需的库 

import pandas as pdimport numpy as np

线图

线图适用于连续数据和时间序列数据。让我们先创建一个序列,然后使用它来创建线图。

series_data = pd.Series(np.random.randn( 500 ), index = pd.date_range( "08/1/2023" , periods = 500 ))

可以使用 dataframe.plot() 或 series.plot() 创建线图。在这里,我将创建一个线图来表示系列值的累积总和。尝试从下面的代码中删除 cumsum() 以查看输出变化 

series_data.cumsum().plot();

现在,让我们尝试使用数据框。我创建了一个包含 500 行和 3 列的数据框,分别名为 A、B、C 

dataframe_data = pd.DataFrame(np.random.randn( 500 , 3 ), index = series_data.index, columns= list ( "ABC" )) dataframe_data.cumsum().plot();

如您所见,三列都标有不同标签,并附有折线图。现在,就像大多数 Python 函数一样,这些 Python 绘图函数带有多个用于创建图形的参数选项。仔细查看代码和图形,查看图形中的变化 

#Introduction the parameter of x_compact; look into the change of x axisdataframe_data.cumsum().plot(x_compat = True);

#We can create subplots too using parameter subplots = Truedataframe_data.cumsum().plot(subplots = True, x_compat = True);

#We can fix the layout of subplot. Try changing (1,3) to (3,1) and you will#see the subplots created as 3 rows and single column.#sharex = True will cause all the graphs to share a single xaxis
dataframe_data.cumsum().plot(subplots = True, layout = (1,3), sharex = False, colormap="gist_rainbow");

如您所见,我们对时间段内数据框的每列(或系列)进行了很好的呈现。尝试更改参数值以查看变化。您一定注意到了“colormap”参数。这会为您的图表设置颜色,使其更具吸引力。

现在,我将利用 matplotlib 来有效地创建子图,以便在一个地方创建多个图形。

import matplotlib.pyplot as plt 
#配置子图#创建两行六列的子图#sharex 和 sharey 设置为 True 以共享 x 轴和 y 轴fig, ax = plt.subplots( 2 , 6 , figsize = ( 16 , 6 ), sharex = True , sharey = True ) plt.subplots_adjust(wspace= 0.5 , hspace= 0.5 )
#设置我们想要在子图中看到图形的位置#尝试更改位置,但必须在子图中定义的行 x 列内figure1 = [ax[ 0 ][ 0 ], ax[ 0 ][ 2 ], ax[ 0 ][ 4 ]] figure2 = [ax[ 1 ][ 1 ], ax[ 1 ][ 3 ], ax[ 1 ][ 5 ]]
#创建图形,使用定义的位置设置子图的轴#legend 设置为 False,将其变为 True 以查看差异dataframe_data.cumsum().plot(subplots = True , ax = figure1, legend = False ) dataframe_data.cumsum().plot(subplots = True , ax = figure2, legend = False )
#子图中各个图形的标题根据位置设置ax[ 0 , 0 ].set_title( "A" ) ax[ 1 , 1 ].set_title( "A" ) ax[ 0 , 2 ].set_title( "B" ) ax[ 1 , 3 ].set_title( "B" ) ax[ 0 , 4 ].set_title( "C" ) ax[ 1 , 5 ].set_title( "C" );

很酷吧?尝试更改参数值以查看差异。只有当你这样做时,你才能更好地理解。好的,现在我们将创建一个表格和图表。我将针对特定列执行此操作以获得更好的视觉效果,但是也可以将多个列合并在一起 

fig, ax = plt.subplots( 1 , 1 , figsize = ( 16 , 3 )) 
# 这是将 x 轴值设置为顶部ax.xaxis.tick_top()
# 从 A 列中取出 10 行,table = True 参数将显示与所选值相对应的表格dataframe_data[ 'A' ][: 10 ].cumsum().plot(table = True , ax = ax);

fig, ax = plt.subplots( 1 , 1 , figsize = ( 16 , 5 )) 
#在轴上绘制表格,按照子图设置,位置固定在右上方pd.plotting.table (ax, dataframe_data.max (), loc = "upper right" , colWidths = [ 0.2 , 0.2 , 0.2 ]) dataframe_data.cumsum().plot(ax=ax, legend = None );

我们还可以设置辅助 y 轴。通常,y 轴位于图表左侧。如果我们想根据相应列中的值来评估某一列,那么我们可以利用这一点。我的意思是如下 

# 绘制了 A 列的折线图,其 y 轴值在左侧,与正常情况一样dataframe_data[ 'A' ].cumsum().plot() #
在同一张图中绘制了另一列 B,但现在右侧有一个辅助 y 轴dataframe_data[ 'B' ].cumsum().plot(secondary_y = True , color = 'orange' );

次要 y 轴也可以像普通 y 轴一样描绘多列 

# 次要 y 轴分配了 A 和 B 列# 因此,左侧的 C 列将自动显示在左侧 y 轴上ax = dataframe_data.cumsum().plot(secondary_y = [ 'A' , 'B' ], mark_right = False ) ax.set_ylabel( 'C' ) ax.right_ax.set_ylabel( 'AB Scale' );


这是参数的结束吗?不!你还可以做更多的事情!既然你现在知道如何进行绘图,那么剩下的任务将变得轻松有趣。如果你想查看可用于绘制数据框的函数的所有选项,只需输入 dataframe.plot? 并在 jupyter 笔记本上按回车键即可。你将看到所有带有说明的选项。同样,如果我想查看 ax 的所有可能性(在创建子图期间设置的轴),那么我将输入 ax? 并在 jupyter 上按回车键。这就是我们的做法!

条形图

对于标记和非时间序列数据,使用条形图。

#创建条形图的一种方法dataframe_data.iloc[: 3 ].plot(kind = 'bar' );


#创建条形图的第二种方法dataframe_data.iloc[ 10 ].plot.bar();

#显示按索引堆叠的所有列dataframe_data.iloc[ 6 : 10 ].plot.bar(stacked = True );

#水平和堆叠dataframe_data.iloc[ 6 : 10 ].plot.barh(stacked = True )

直方图

#对于特定列dataframe_data[ 'C' ].plot.hist(); 
#这将显示 C 列中某个值的频率或计数

#对于所有列dataframe_data.plot.hist(alpha = 0.5 );

#堆叠直方图dataframe_data.plot.hist(stacked = True , bins = 20 , alpha = 0.5 );

dataframe_data.plot.hist(stacked = True,bins = 20,alpha = 0.5,方向 = “水平” );

#用于绘制累积和堆叠直方图dataframe_data.plot.hist(stacked = True , bins = 20 , alpha = 0.5 , orientation = "horizontal" ,cumulative = True , figsize = ( 10 , 5 ));

箱线图

dataframe_data.plot.box();

#colors 可以按如下方式调整;这些是条形图可识别的四个字典键color = {     "boxes" : "Blue" ,     "whiskers" : "Orange" ,     "medians" : "Pink" ,     "caps" : "Black" , } 
dataframe_data.plot.box(color = color, sym = 'r*' );

dataframe_data.plot.box(color = color, sym = 'r*', vert = False);

面积图

可以使用所有正值或所有负值来创建面积图,并且这些图默认是堆叠的。

df = pd.DataFrame( abs (np.random.randn( 10 , 3 )), columns = list ( 'ABC' )) df.plot.area();

df.plot.area(stacked= False,alpha= 0.5);

散点图

散点图需要 x 轴和 y 轴的数字列。让我们在子图中创建不同类型的散点图。

#creating categorical data column which we will use to categorize by colour in scatter plotdataframe_data['categorical_data'] = pd.Categorical(['High']*100 + ['Medium']*150 + ['Low'] * 250)
#configuring subplotfig, ax = plt.subplots(2,2, figsize = (16, 8))
#creating individual scatter plots by specifying the axes position on subplotsdataframe_data.plot.scatter(x = 'A', y = 'B', ax = ax[0][0])ax[0][0].set_title('Scatter Plot')
dataframe_data.plot.scatter(x='A', y='B', color = 'purple', label = 'AB Group', ax = ax[0][1])dataframe_data.plot.scatter(x = 'B', y = 'C', color = 'orange', label = 'BC Group', ax = ax[0][1])ax[0][1].set_title('Scatter Plot with grouping')
dataframe_data.plot.scatter('A', 'B', c = 'C', ax = ax[1][0])ax[1][0].set_title('Scatter Plot with a continuous column as colour indicator')
dataframe_data.plot.scatter('A', 'B', c= 'categorical_data', cmap = 'viridis', s = 10, ax = ax[1][1])ax[1][1].set_title('Scatter Plot with a categorical column as colour indicator');

子图看起来很有趣,但有点笨拙。这是为了演示目的,但在现实生活中,我们应该清晰地呈现图表,子图应该有相对的数字。您可以通过删除子图轴部分将上述图创建为单独的图。让我们创建更多单独的散点图。

#这里我们使用颜色图和颜色作为分类数据列。#气泡的大小是 C 列的值乘以 200 dataframe_data.plot.scatter( 'A' , 'B' , c= 'categorical_data' , cmap = 'viridis' , s = dataframe_data[ 'C' ]* 200 , figsize = ( 12 , 6 ));

#我们也可以创建密度散点图
pd.plotting.scatter_matrix(dataframe_data, diagonal = 'kde' );

六边形箱图

对于大量数据点,散点图可能过于密集和笨拙。这时我们就可以使用六边形图。

dataframe_data.plot.hexbin('A''B', gridsize = 30);

可以使用参数 gridsize 调整 x 方向的六边形数量。默认值为 100,网格尺寸越大,箱体数量越多,箱体越小。

dataframe_data.plot.hexbin('A''B', C = 'C', gridsize=20)

饼图

饼图适用于正数据。如果数据中有任何负值,将引发 ValueError。

df[ 'A' ] . plot.pie(figsize=( 2,2 ) );

df.plot.pie(y = 'A' , figsize = (3 , 3 ), legend = False , labels = None , autopct= "%.2f" , fontsize= 5 );


df.plot.pie(subplots=True, figsize = (10,10));

密度图

dataframe_data.plot.kde()plt.xlabel('Values')plt.ylabel('Density Plot')plt.title('Density plot for all columns');

Pandas 如何处理丢失的数据?

根据绘图类型,数据中的缺失值将被删除、省略或填充。您可以决定如何处理缺失值,例如使用 dropna() 和 fillna() 函数,或者 pandas 绘图函数将按照下图处理缺失数据 -

图片来源于 Python Pandas 文档

结论

这里展示的图表和方法被许多组织广泛用于日常的多项任务。图表应该简单、清晰、易于理解。x 轴和 y 轴上应该有适当的标签。每个图表都应该有标题,如果在同一张图表上描绘了多列,则图例必不可少。出于演示目的,我并没有在所有地方都使用标签和标题,但使用这些函数是一种最佳实践,就像我在密度图中使用的一样。

本人接python、matlab程序设计

—  —


进修编程
提升编程技能,学习编程技巧