目录
加载示例数据
创建一个最简单的散点图
开始让散点图变得丰富起来
让散点图再一次变得更漂亮
让散点图更加有品味
实验代码获得方法
在本教程中,关于常见的散点图,将对其进行美化,最终效果如图:
加载示例数据
在本教程,我们首先创建包含一些客户消费数据的示例数据集,以DataFrame
类型变量储存。每个数据点将包括:
客户的交易次数 客户每笔交易的金额。
让我们从加载库和以及DataFrame
数据 来开始:
mport pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use("Qt5Agg")
data = {
'Purchase Frequency': [5, 8, 3, 9, 7, 6, 2, 4, 1, 9,
11, 15, 14, 20, 18, 22, 25, 16, 21, 25],
'Purchase Amount': [150, 70, 190, 140, 60, 80, 55, 75, 65, 85,
50, 120, 30, 20, 180, 160, 140, 70, 90, 40] }
df = pd.DataFrame(data)
print(df.head())
# Returns:
# Purchase Frequency Purchase Amount
# 0 5 150
# 1 8 70
# 2 3 190
# 3 9 140
# 4 7 60
创建一个最简单的散点图
现在我们已经定义了 DataFrame,我们可以创建一个简单的散点图来开始。这将帮助我们更好地理解数据的性质。为此,我们可以使用该plt.scatter()
函数。
# 创建一个简单的散点图
x = df[ 'Purchase Frequency' ]
y = df[ 'Purchase Amount' ]
plt.scatter(x, y)
plt.show()
代码说明:
在上面的代码块中,我们首先为数据系列创建了两个变量: x
和y
。这将使创建图表和代码变得更加简单。通过将这两个变量传递给函数 plt.scatter()
,完成创建了以下图表。
开始让散点图变得丰富起来
在本节中,我们将通过以下方式开始修改图表:
更明确地创建图形和轴对象 添加轴标签 修改轴范围
fig, ax = plt.subplots(figsize=(8, 8))
ax.scatter(x, y)
# Clean up axes labels
axes_fonts = {'fontsize': 12, 'fontweight': 'bold'}
ax.set_xlabel('Purchase Frequency (#)', fontdict=axes_fonts)
ax.set_ylabel('Purchase Amount ($)', fontdict=axes_fonts)
# Clean up axes values
ax.set_ylim(0, y.max() + 20)
ax.set_xlim(0, x.max() + 2)
plt.show()
这个图表看起来还是有点简陋,于是在图表中添加水平线和垂直线,以突出显示平均销售数量和平均销售金额。这样可以让我们更好地将客户细分为不同的群体。
在 Matplotlib 中,我们可以使用plt.vlines()
和plt.hlines()
函数来执行此操作。这两个函数的工作原理类似。以该plt.hlines()
函数为例,创建一条水平线,并需要以下参数:
y
:表示放置线条的 y 位置xmin
并xmax
:指出线应该从哪里跨越到哪里linestyles
:设定线型colors
:线条颜色
# 添加垂直线表示平均购买频率
plt.vlines(x=x.mean(), ymin= 0 , ymax=ymax, linestyles= 'dashed' , colors= 'grey' )
# 添加水平线表示平均购买金额
plt.hlines(y=y.mean(), xmin= 0 , xmax=xmax, linestyles= 'dashed' , colors= 'grey' )
plt.show()
代码解读:添加了两个函数调用:一个用于添加垂直线,另一个用于添加水平线。设置它们线条样式为虚线以及灰色,以防止它们过于突出。将会得到:
现在图看起来比较比较丰富,但是还不够!
让散点图再一次变得更漂亮
可以通过提供一些必要的标注信息,使得图像看起来专业,所以接下来,将通过使用ax.text()
完成必要信息的标注。ax.text()
包含以下参数:
x
和y
:指定文本的位置s
:标注文本字符串
(xmin,xmax)=ax.get_xlim()
(ymin,ymax)=ax.get_ylim()
plt.vlines(x=x.mean(), ymin=0, ymax=ymax, linestyles='dashed', colors='grey')
# Add a horizontal line for average purchase amount
plt.hlines(y=y.mean(), xmin=0, xmax=xmax, linestyles='dashed', colors='grey')
ax.text(
x=xmax-0.5, y=y.mean()+2, s=f'Average purchase amount: ${y.mean():.2f}',
ha='right', va='bottom', fontsize=10, color='grey')
# Add text along the mean number of purchases
ax.text(
x=x.mean()-0.25, y=ymax-5, s=f'Average purchases: {x.mean():.1f}',
rotation=90, ha='right', va='top', color='grey')
ax.scatter(x, y)
plt.show()
代码解读:在上面的代码块中,添加了两个标注方法调用。第一个方法调用添加了水平文本以及均值信息,并次使用灰色对其进行样式设置,使其稍微淡化一点。对于垂直方向的文本,旋转文本以明确该文本归属。
得到:
接下来,在图表中添加阴影,以帮助读者更好地理解一些希望传达的对比信息。现在将添加两个阴影区域:
一个是重点介绍那些支出和交易量低于平均水平的客户 一是重点突出那些消费额和交易量都高于平均水平的客户
在 Matplotlib 中,可以使用ax.axhspan()
方法添加阴影。该方法要求传入:
x
和y
的最小值和最大值;color
:阴影颜色alpha
:阴影的透明度
x_mean_fraction = x.mean() / xmax
ax.axhspan(
ymin= 0 , ymax=y.mean(), xmin= 0 , xmax=x_mean_fraction,
alpha= 0.25 , color= 'pink' )
ax.axhspan(
ymin=y.mean(), ymax=ymax, xmin=x_mean_fraction,
xmax= 1 , alpha= 0.25 , color= 'lightgreen' )
ax.scatter(x, y)
plt.show()
代码解读:上面的代码块中,我创建了两个阴影填充区域。注意,该ax.axhspan()
方法的水平坐标值在 0 和 1 之间,因此,创建一个分数来定义我们希望阴影发生的位置。通过创建变量来实现这一点x_mean_fraction
,该变量将该系列的平均值除以其最大值。这将得到:
现在是不是很不错了?但是,现在再利用之前使用的方法对它们进行标记,使这一切变得更清楚一些:
ax.text(x=0.5, y=3, s='Low frequency, low amount', color='firebrick')
ax.text(
x=xmax-0.5, y=ymax-2, s='High frequency, high amount',
color='darkgreen', ha='right', va='top')
代码解读:这里,我们添加了两个文本标签。一个位于左下角,采用类似的红色色调来细分这些客户。还在右上角添加了另一个,以添加另一个细分标签。将得到:
让散点图更加有品味
目前,所有的点都是相同的颜色。可以根据它们所在的象限来进一步设计它们的样式,添加三种不同的颜色,这将使可视化感觉更加具有凝聚力:
落入左下角的将是红色, 右上角的是绿色, 其余均为灰色。
为了实现这一点,我们将向DataFrame
添加一个条件列。我们可以通过定义一个函数并将其传递给.apply()
方法来实现这一点。让我们看看它是什么样子的:
# Adding a conditional column to our DataFrame
x_mean, y_mean = x.mean(), y.mean()
def color_dot(s):
if (s['Purchase Amount'] < y_mean) & (s['Purchase Frequency'] < x_mean):
return 'firebrick'
elif (s['Purchase Amount'] > y_mean) & (s['Purchase Frequency'] > x_mean):
return 'darkgreen'
else:
return 'grey'
df['Color'] = df.apply(color_dot, axis=1)
print(df.head())
ax.scatter(x, y, c=df[ 'Color' ])
# Returns:
# Purchase Frequency Purchase Amount Color
# 0 5 150 grey
# 1 8 70 firebrick
# 2 3 190 grey
# 3 9 140 grey
# 4 7 60 firebrick
现在可以使用这个附加列为散点图添加特定颜色,然后绘图得到:
注意:在scatter()
中通过c
赋予df
中的颜色条件列df[ 'Color' ]
,实现不同象限的散点颜色控制。
现在对比一下,是不是优雅很多了?
🌟关于该实验的完整代码🌟
首先非常感谢朋友们对我的文章和公众号的支持!非常高兴能和大家分享一些文献和机器学习相关信息。如果你觉得这篇文章对你有帮助,并对完整的代码感兴趣,两步就可以得到这份代码啦:1)将我的公众号文章(任一)分享到朋友圈,并收集到10个赞;2)完成后,请将分享截图后台私信给我并留下邮箱,我将会稍后发送完整的实验代码给您作为感谢。
这样不仅可以帮助更多的人获得有价值的信息,也能鼓励我继续创作出更多优质内容。感谢你的支持与理解,期待你的截图哦!😊
声明:本公众号分享的前沿学术成果来源于各学术网站,不依法享有其所有权。若原作者发现本次分享中的文字及图片涉及侵权,请立刻联系公众号后台或发送邮件,我们将及时修改或删除!
邮箱:environmodel@sina.com
若您认为有用,欢迎
将Environmodel设为星标,或
点击“在看”或“分享”给他人