跟着Nature学画棒棒糖图:审稿人说好甜!

文摘   2024-08-03 23:51   德国  

棒棒糖图(Lollipop Plot)是一种简单而直观的图表,主要用于展示数据点的分布或比较。它结合了柱状图和散点图的特点,通过圆点和线条来表示数据点的位置和大小。

棒棒糖!

棒棒糖,好吃也好用!

棒棒糖图的特点

  • 圆点(Dot):每个数据点用一个圆点表示,圆点的位置代表数据点的数值。
  • 线条(Line):从基线到圆点的线条连接圆点,增加数据点的可读性和图表的清晰度。
  • 简洁性(Simplicity):相比柱状图,棒棒糖图减少了图表的视觉元素,使得数据更加清晰和易于比较。
  • 颜色和大小(Color and Size):可以通过改变圆点和线条的颜色和大小来表示额外的信息或突出特定的数据点。

棒棒糖图的优点

  • 清晰直观:棒棒糖图减少了视觉杂乱,使数据点更清晰易读。比如适合使用在引文分析的数据或者列举不同研究的数据情况的场景。
  • 空间效率:在数据点较多的情况下,比柱状图更节省空间。
  • 易于比较:通过减少视觉元素,棒棒糖图可以更好地比较数据点之间的差异。
  • 灵活性高:可以根据需要自定义圆点和线条的颜色、大小和样式,适应不同的展示需求。

棒棒糖图的缺点

  • 信息密度低:相比于其他更复杂的图表,棒棒糖图适合展示单一维度的数据,信息量较少。
  • 不适合大数据集:当数据点非常多时,棒棒糖图可能变得混乱,不易阅读。
  • 缺少误差信息:通常情况下,棒棒糖图不展示误差信息或置信区间,没有bar值,需要额外的图表或标注来补充这些信息。

绘图

数据介绍

我们这次使用了20为学生的成绩来作为我们学习棒棒糖图的数据组,每位学生的成绩包括三部分:

  • 出勤率(Attend):以百分比的形式记录了学生出勤情况。
  • 学习时长(Hrw):记载了学生花在学习上的时间,单位为小时。
  • 学生考试成绩(Marks):记载了学生最近一次考试的成绩,满分20分。
数据小样

导入环境

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

  • matplotlib.pyplot:用于创建图形和图表的Python库。
  • numpy:用于科学计算的库,提供了强大的数组对象和数学函数。
  • pandas:用于数据处理和分析的库,提供了数据结构和操作工具。

导入数据

# 载入数据并保存为DataFrame
file_path = '/content/mediation1.csv'
data = pd.read_csv(file_path)
  • file_path:CSV文件的路径。
  • pd.read_csv(file_path):读取CSV文件并将其加载到DataFrame中,data是包含数据的DataFrame。

绘图方程


# 绘图的方程
def create_lollipop_plot(data, title):
    plt.figure(figsize=(14, 8))

    # 设定图表颜色为蓝色
    color = 'blue'
  • def create_lollipop_plot(data, title):定义一个函数来创建棒棒糖图。
  • plt.figure(figsize=(14, 8)):创建一个新的图形,并设置图形的大小为14x8英寸。
    # Plotting Attend, Hrw, and Marks for each sample
    for i in range(data.shape[0]):
        # Draw a vertical line from the baseline to the value
        plt.vlines(x=['Attend''Hrw''Marks'], ymin=0, ymax=data.iloc[i], color=color, alpha=0.7, linewidth=2)
        # Draw a dot at the value
        plt.scatter(x=['Attend''Hrw''Marks'], y=data.iloc[i], color=color, s=100, label=f'Sample {i+1}')
  • for i in range(data.shape[0]):遍历每一行数据。
  • plt.vlines:绘制垂直线:
  • x:线的x位置(这里是['Attend', 'Hrw', 'Marks'])。
  • ymin:线的起始点(0)。
  • ymax:线的结束点(对应每个样本的值)。
  • color:线的颜色。
  • alpha:透明度。
  • linewidth:线的宽度。
  • plt.scatter:绘制散点图:x:点的x位置(这里是['Attend', 'Hrw', 'Marks'])。
  • y:点的y值(对应每个样本的值)。
  • color:点的颜色。
  • s:点的大小。
  • label:点的标签(样本编号)。
    # Adding labels and title
    plt.title(title)
    plt.xlabel('Category')
    plt.ylabel('Values')
  • plt.title(title):设置图表的标题。
  • plt.xlabel('Category'):设置x轴标签。
  • plt.ylabel('Values'):设置y轴标签。
    # Custom legend
    handles, labels = plt.gca().get_legend_handles_labels()
    by_label = dict(zip(labels, handles))
    plt.legend(by_label.values(), by_label.keys(), bbox_to_anchor=(1.05, 1), loc='upper left')

    # 生成图表
    plt.show()

  • plt.gca().get_legend_handles_labels():获取当前轴的句柄和标签。
  • dict(zip(labels, handles)):将标签和句柄配对,去除重复标签。
  • plt.legend:设置图例:
  • by_label.values():图例句柄。
  • by_label.keys():图例标签。
  • bbox_to_anchor:图例的位置。
  • loc:图例锚点位置。

绘图


# Plot for all rows
create_lollipop_plot(data, 'Lollipop Plot Comparing Attend, Hrw, and Marks for Each Sample')
  • create_lollipop_plot(data, 'Lollipop Plot Comparing Attend, Hrw, and Marks for Each Sample'):调用函数,绘制所有行数据的棒棒糖图。
生成的图表

拓展!

从我们生成的图表来看,我们会发现学生的出勤状况被分成了5组,而学习时间和考试成绩大致相似。持此之外,我们也意识到了我们的图表在某些方面仍然可以提高。

五颜六色的棒棒糖

首当其冲的,我们应该改变图表的颜色。全部使用蓝色导致我们无法对学生进行区分。而让每个学生拥有他们自己的颜色其实非常简单。

# 绘图的方程
def create_lollipop_plot(data, title):
    plt.figure(figsize=(14, 8))

    # 设置颜色为一个序列
    colors = plt.cm.viridis(np.linspace(0, 1, data.shape[0]))
  • plt.cm.viridis:使用viridis颜色映射,生成一系列颜色。
  • np.linspace(0, 1, data.shape[0]):生成从0到1之间等间距的值,数量为数据的行数。
  • colors:为每个样本分配一个颜色。

    # Plotting Attend, Hrw, and Marks for each sample
    for i in range(data.shape[0]):
        # Draw a vertical line from the baseline to the value
        plt.vlines(x=['Attend''Hrw''Marks'], ymin=0, ymax=data.iloc[i], color=colors[i], alpha=0.7, linewidth=2)
        # Draw a dot at the value
        plt.scatter(x=['Attend''Hrw''Marks'], y=data.iloc[i], color=colors[i], s=100, label=f'Sample {i+1}')

我们将color = color 改成了color = colors[i]以此来保证每位学生都会用不同的颜色代表

色彩斑斓的棒棒糖们

吃太多糖对身体不好

看起来好多了,我们现在能够通过颜色来区分不同的颜色了。但是说到区别学生,我觉得我们的点有些太多了。这样有助于我们找到数据中的趋势,但是这也使得我们无法准确的找到某个学生。为了能够准确地找到每个学生,我觉得我们应该限制途中学生的数量。幸运的是,限制学生数量非常简单:


# Plot for all rows
create_lollipop_plot(data.iloc[:10], 'Lollipop Plot Comparing Attend, Hrw, and Marks for Each Sample')

data.iloc[:10]:使用数据中的头10个来绘图

看起来清晰多了

供稿:徐可

还想要更多的绘图资源包吗?现在:


长按扫码关注:科研生信充电宝

转发此条推送至朋友圈,点赞超过30条,截图至后台小编微信

即可直接解锁:


《跟着Nature学画棒棒图》对应资源哦~


看到这里你还不心动吗?


赶紧关注、转发、点赞、分享,领取你的专属福利吧~



好啦,以上就是今天推文的全部内容啦!


版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。

如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。

BIOINFOR

微信号|科研生信充电宝

 · BIOINFOR · 


永远相信美好的事情

即将发生



科研生信充电宝
介绍科研;介绍统计;介绍生信;
 最新文章