点击上方“进修编程”,选择“星标”公众号
超级无敌干货,第一时间送达!!!
现在pandas在数据可视化中的地位举足轻重。这篇文章给大家讲述完整的pandas使用指南、大家可以收藏日后使用时查看即可。
数据分析师、数据科学家以及其他少数职业需要具备从数据中生成信息的能力。此过程涉及统计数据、数据挖掘技术、模型学习等的使用。还有一个非常关键的步骤,即数据可视化。为了有效地可视化数据,我们有多种工具,如 Tableau、Power BI 等。但是,python 库足以创建有吸引力、清晰且富有创意的可视化效果,以描绘对数据的深刻见解。为了做出重要的业务决策,企业通常更关心可视化,而不是可视化创建过程中涉及的数学和编码。作为开发人员,我们应该更加关注流程,例如编码,以便在不犯任何错误的情况下描绘清晰而重要的信息。我们在数据可视化方面的错误可能会导致错误的信息。因此,数据可视化非常重要。
好的,现在让我们开始吧。在这篇博客中,我不会使用 matplotlib(除了 subplot)。我将使用 Pandas,您将看到 Pandas 绘图非常漂亮,涵盖了大多数所需的图表。有高级的图表制作技术,但可以使用 seaborn 和 matplotlib 来完成。Pandas 库为重要的图表创建提供了一套很好的函数。这篇文章主要是实践性的,很少涉及理论。我们练习得越多,我们知道的就越多!让我们开始吧。
内容
线图
条形图
直方图
箱线图
面积图
散点图
六边形箱图
饼图
密度图
Pandas 图表如何处理缺失数据!
结论
导入所需的库
import pandas as pd
import 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 axis
dataframe_data.cumsum().plot(x_compat = True);
#We can create subplots too using parameter subplots = True
dataframe_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 plot
dataframe_data['categorical_data'] = pd.Categorical(['High']*100 + ['Medium']*150 + ['Low'] * 250)
#configuring subplot
fig, ax = plt.subplots(2,2, figsize = (16, 8))
#creating individual scatter plots by specifying the axes position on subplots
dataframe_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 绘图函数将按照下图处理缺失数据 -
结论
这里展示的图表和方法被许多组织广泛用于日常的多项任务。图表应该简单、清晰、易于理解。x 轴和 y 轴上应该有适当的标签。每个图表都应该有标题,如果在同一张图表上描绘了多列,则图例必不可少。出于演示目的,我并没有在所有地方都使用标签和标题,但使用这些函数是一种最佳实践,就像我在密度图中使用的一样。
本人接python、matlab程序设计
— 完 —