科研绘图教程3 | 有代码!绘制一张优雅的散点图竟然使我突破了练气第三层!

文摘   2024-10-26 20:21   新加坡  
点击订阅公众号 | 前沿学术成果每日更新               

目录

  • 加载示例数据

  • 创建一个最简单的散点图

  • 开始让散点图变得丰富起来

  • 让散点图再一次变得更漂亮

  • 让散点图更加有品味

  • 实验代码获得方法

在本教程中,关于常见的散点图,将对其进行美化,最终效果如图:

加载示例数据

在本教程,我们首先创建包含一些客户消费数据的示例数据集,以DataFrame 类型变量储存。每个数据点将包括:

  1. 客户的交易次数
  2. 客户每笔交易的金额。

让我们从加载库和以及DataFrame数据 来开始:

mport pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.use("Qt5Agg")
data = {
    'Purchase Frequency': [5839762419,
                           11151420182225162125],
    'Purchase Amount': [15070190140608055756585,
                        501203020180160140709040] }

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()

代码说明:

  • 在上面的代码块中,我们首先为数据系列创建了两个变量:xy。这将使创建图表和代码变得更加简单。
  • 通过将这两个变量传递给函数plt.scatter(),完成创建了以下图表。
image-20241026193153193

开始让散点图变得丰富起来

在本节中,我们将通过以下方式开始修改图表:

  1. 更明确地创建图形和轴对象
  2. 添加轴标签
  3. 修改轴范围
fig, ax = plt.subplots(figsize=(88))
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()
img

这个图表看起来还是有点简陋,于是在图表中添加水平线和垂直线,以突出显示平均销售数量和平均销售金额。这样可以让我们更好地将客户细分为不同的群体。

在 Matplotlib 中,我们可以使用plt.vlines()plt.hlines()函数来执行此操作。这两个函数的工作原理类似。以该plt.hlines()函数为例,创建一条水平线,并需要以下参数:

  • y:表示放置线条的 y 位置

  • xminxmax:指出线应该从哪里跨越到哪里

  • 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()

代码解读:添加了两个函数调用:一个用于添加垂直线,另一个用于添加水平线。设置它们线条样式为虚线以及灰色,以防止它们过于突出。将会得到:

img

现在图看起来比较比较丰富,但是还不够!

让散点图再一次变得更漂亮

可以通过提供一些必要的标注信息,使得图像看起来专业,所以接下来,将通过使用ax.text()完成必要信息的标注。ax.text()包含以下参数:

  1. xy:指定文本的位置
  2. 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()

代码解读:在上面的代码块中,添加了两个标注方法调用。第一个方法调用添加了水平文本以及均值信息,并次使用灰色对其进行样式设置,使其稍微淡化一点。对于垂直方向的文本,旋转文本以明确该文本归属。

得到:

img

接下来,在图表中添加阴影,以帮助读者更好地理解一些希望传达的对比信息。现在将添加两个阴影区域:

  1. 一个是重点介绍那些支出和交易量低于平均水平的客户
  2. 一是重点突出那些消费额和交易量都高于平均水平的客户

在 Matplotlib 中,可以使用ax.axhspan()方法添加阴影。该方法要求传入:

  • xy 的最小值和最大值;

  • 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,该变量将该系列的平均值除以其最大值。这将得到:

img

现在是不是很不错了?但是,现在再利用之前使用的方法对它们进行标记,使这一切变得更清楚一些:

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')

代码解读:这里,我们添加了两个文本标签。一个位于左下角,采用类似的红色色调来细分这些客户。还在右上角添加了另一个,以添加另一个细分标签。将得到:

img

让散点图更加有品味

目前,所有的点都是相同的颜色。可以根据它们所在的象限来进一步设计它们的样式,添加三种不同的颜色,这将使可视化感觉更加具有凝聚力:

  1. 落入左下角的将是红色,
  2. 右上角的是绿色,
  3. 其余均为灰色。

为了实现这一点,我们将向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

现在可以使用这个附加列为散点图添加特定颜色,然后绘图得到:

img

注意:在scatter()中通过c赋予df中的颜色条件列df[ 'Color' ],实现不同象限的散点颜色控制。

现在对比一下,是不是优雅很多了?

image-20241026200635564image-20241022191312573

🌟关于该实验的完整代码🌟

首先非常感谢朋友们对我的文章和公众号的支持!非常高兴能和大家分享一些文献和机器学习相关信息。如果你觉得这篇文章对你有帮助,并对完整的代码感兴趣,两步就可以得到这份代码啦:1)将我的公众号文章(任一)分享到朋友圈,并收集到10个赞;2)完成后,请将分享截图后台私信给我并留下邮箱,我将会稍后发送完整的实验代码给您作为感谢。

这样不仅可以帮助更多的人获得有价值的信息,也能鼓励我继续创作出更多优质内容。感谢你的支持与理解,期待你的截图哦!😊

               

               

声明:本公众号分享的前沿学术成果来源于各学术网站,不依法享有其所有权。若原作者发现本次分享中的文字及图片涉及侵权,请立刻联系公众号后台或发送邮件,我们将及时修改或删除!         

邮箱:environmodel@sina.com         

若您认为有用,欢迎

Environmodel设为星标,或

点击“在看”或“分享”给他人

Environmodel
Environmodel(环境模型)专注于环境科学与工程领域的建模及模型研究进展,并分享涵盖机器学习、深度学习以及人工智能等相关领域的理论知识、主流工具和Python编程技巧。
 最新文章