前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python单细胞学习笔记-day5

python单细胞学习笔记-day5

作者头像
生信技能树
发布2025-01-22 11:15:03
发布2025-01-22 11:15:03
4500
代码可运行
举报
文章被收录于专栏:生信技能树生信技能树
运行总次数:0
代码可运行

前面,我们生信技能树的讲师小洁老师与萌老师新开了一个学习班:《掌握Python,解锁单细胞数据的无限可能》,身为技能树的一员,近水楼台先得月,学起!下面是我的学习笔记,希望可以给你带来一点参考。

前面的学习笔记:

今天继续学习视频:python_day5 !一口气学完吧!

代码语言:javascript
代码运行次数:0
运行
复制
touch day5.ipynb

课前复习到 30:29

plotnine语法

plotnine是python版的ggplot2,有一些细节不同。

  • 一句代码前后要加()
  • 列名要带引号
  • 形状不能用数字
  • 用加号连接的代码不缩进

示例数据

还是使用的seaborn模块里面的iris数据:

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd
iris = pd.read_csv("day4/iris.csv")
iris.head()

安装一下今天需要使用的模块:

代码语言:javascript
代码运行次数:0
运行
复制
# bash终端
conda activate sc
pip install plotnine -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

pip install patchworklib -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

导入模块:这里引入了plotnine里面所有的函数,这样就不需要每次都写plotnine.xx函数。

代码语言:javascript
代码运行次数:0
运行
复制
from plotnine import *

1.入门级绘图模版

需要的数据:横坐标、纵坐标,需要卸载aes的括号里面

代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris) +
 geom_point(aes(x='sepal_length', y='petal_length')))

非常具有ggplot2的风格!

2.属性设置

属性包括:

属性

参数

颜色

color

大小

size

形状

shape

透明度

alpha

填充颜色

fill

2.1 统一设置

统一设置需要设为有意义的值。

  • 颜色:字符串,blue,red或者颜色编码(后面介绍)
  • 大小:单位mm
  • 形状:数字编号表示

shape

o

.

,

v

^

<

>

1

2

3

4

s

p

*

h

H

+

x

D

d

形状

圆圈

像素点

倒三角

正三角

左三角

右三角

下箭头

上箭头

左箭头

右箭头

正方形

五角形

星号

六边形

另一种六边形

加号

叉号

菱形

瘦菱形

修改颜色:color='blue'
代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris) + 
 geom_point(aes(x='sepal_length', y='petal_length'), 
            color='blue')) 
修改其他属性 size=5、alpha=0.5、shape='*'
代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris) + 
 geom_point(aes(x='sepal_length', y='petal_length'), 
            size=5,     # 点的大小5mm
            alpha=0.5,  # 透明度 50%
            shape='*'))   # 点的形状

2.2 映射:按照数据框的某一列来定义图的某个属性

根据“species”列来定义“颜色”这个属性,即:相同的值是相同的颜色,不同的值对应不同的颜色,有三个值所以自动分配了三种颜色。

note:需要写到aes括号里面。

代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris) +
 geom_point(aes(x='sepal_length', y='petal_length', color='species')))
2.2.1 自行指定映射的具体颜色

可以使用 scale_xx_manual 的函数

具体的颜色名:

代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris) +
 geom_point(aes(x='sepal_length', y='petal_length', color='species')) +
 scale_color_manual(values=['blue', 'green', 'red']))

颜色编码:

代码语言:javascript
代码运行次数:0
运行
复制
# 十六进制颜色
(ggplot(data=iris) +
 geom_point(aes(x='sepal_length', y='petal_length', color='species')) +
 scale_color_manual(values=['#2874C5', '#e6b707', '#f87669']))
2.2.2 最好的配色库pypalettes

上一节课也出现了这个配色网址:在这里看有哪些配色,2500+种!https://python-graph-gallery.com/color-palette-finder/

代码语言:javascript
代码运行次数:0
运行
复制
import pypalettes 
cs = pypalettes.load_cmap('Abbott')
cs.colors

(ggplot(data=iris) +
 geom_point(aes(x='sepal_length', y='petal_length', color='species')) +
 scale_color_manual(values=cs.colors))

很方便换主题:

代码语言:javascript
代码运行次数:0
运行
复制
# 直接在这里换主题即可
pypalettes.load_cmap('a_palette')
2.2.3 区分color和fill参数
  • 默认实心
  • 如需空心形状,写fill = 'none'
代码语言:javascript
代码运行次数:0
运行
复制
# 实心形状,用color设置颜色
(ggplot(data=iris) +
 geom_point(aes(x='sepal_length', y='petal_length', color='species'), 
            shape='^',size = 3)) 

空心:fill = 'none'

shape='h':六边形

代码语言:javascript
代码运行次数:0
运行
复制
# 空心形状,fill = 'none'
(ggplot(data=iris) +
 geom_point(aes(x='sepal_length', y='petal_length', color='species'), 
            shape='h',size = 3, fill='none'))  

同时设置边框和填充色:红绿搭配,干活不累,哈哈哈哈

代码语言:javascript
代码运行次数:0
运行
复制
# 双色,color设置边框颜色,fill设置填充颜色
(ggplot(data=iris) +  
 geom_point(aes(x='sepal_length', y='petal_length'), 
            shape='^', 
            color='red', 
            fill='green',
            size = 3))  

3.几何对象

几何对象:geom_开头的函数

可以在同一个图里面面叠加多个几何对象,但是代码变得罗嗦了:写了两遍aes(x='sepal_length', y='petal_length')。

代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris) + 
 geom_smooth(aes(x='sepal_length', y='petal_length')) +
 geom_point(aes(x='sepal_length', y='petal_length')))

简化:将aes(x='sepal_length', y='petal_length')放在ggplot括号里

代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris, mapping=aes(x='sepal_length', y='petal_length')) +
 geom_smooth() +
 geom_point())

4.位置调整

geom_point():相同位置的点重叠在一起,信息被隐藏

代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris, mapping=aes(x='species', y='sepal_width')) + 
 geom_boxplot(aes(fill='species'),alpha = 0.5) +
 geom_point())

解决办法:使用 geom_jitter函数

代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris, mapping=aes(x='species', y='sepal_width')) + 
 geom_boxplot(aes(fill='species'),alpha = 0.5) +
 geom_jitter())

5.坐标系

使用coord_flip() 进行坐标轴翻转:

代码语言:javascript
代码运行次数:0
运行
复制
(ggplot(data=iris, mapping=aes(x='species', y='sepal_width')) + 
 geom_boxplot(aes(fill='species'),alpha = 0.5) +
 geom_jitter() + 
 coord_flip()) #横纵坐标互换

6.主题

改一个试试:theme_bw()

代码语言:javascript
代码运行次数:0
运行
复制
# theme_bw()
(ggplot(data=iris, mapping=aes(x='species', y='sepal_width')) + 
 geom_boxplot(aes(fill='species'),alpha = 0.5) +
 geom_jitter() + 
 theme_bw())

theme_classic()

代码语言:javascript
代码运行次数:0
运行
复制
# theme_classic()
(ggplot(data=iris, mapping=aes(x='species', y='sepal_width')) + 
 geom_boxplot(aes(fill='species'),alpha = 0.5) +
 geom_jitter() + 
 theme_classic())

7.保存

使用ggsave()

代码语言:javascript
代码运行次数:0
运行
复制
p = (ggplot(data=iris, mapping=aes(x='species', y='sepal_width', fill='species')) + 
 geom_boxplot(alpha = 0.5) +
 geom_jitter() + 
 theme_bw())
ggsave(p,filename="boxplot.png")

8.拼图

使用 patchworklib模块:

代码语言:javascript
代码运行次数:0
运行
复制
import patchworklib as pw

p1 = (ggplot(data=iris) +
      geom_point(aes(x='sepal_length', y='petal_length')))

p2 = (ggplot(data=iris) +
      geom_boxplot(aes(x='species', y='sepal_length')))

# 使用patchworklib加载plotnine图表
g1 = pw.load_ggplot(p1, figsize=(2,3))
g2 = pw.load_ggplot(p2, figsize=(2,3))
g1|g2

下一个知识点 讲解 01:42:28

1.NA缺失值

  • 判断是否是缺失值:pd.isna()
  • 插补缺失值:pd.fill_na()

1.1 判断是否是缺失值

在python中,NaNNULLNANone都是缺失值的意思,但在R语言:

  • NaN表示非数值(Not a Number),计算0/0或者计算负数的平方根时会得出。
  • NULL表示没有、不存在
  • NA 表示缺失值,特指存在但未知的值。
  • 含缺失值的数据集非常常见。写代码时提到缺失值要写None或者是np.NaNnp.NAN,np.nan

构造一个含有缺失值的数据框:写的时候是None,但是显示为NaN,python中这两者不区分。

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd

df = pd.DataFrame({'gene':['gene1','gene2','gene3'],
                   'sample1':[None,16.0,3.0],
                   'sample2':[2,11,1]})
print(df)
代码语言:javascript
代码运行次数:0
运行
复制
# 判断是否含有缺失值
pd.isna(df.sample1)

# 统计有多少个缺失值
df['sample1'].isna().value_counts()

1.2 插补缺失值

.fillna()函数 :将列中的所有缺失值替换为提供的值。

例如:将 sample1 列里面的 NA 填充上该列的平均值,传递给 f 列:

代码语言:javascript
代码运行次数:0
运行
复制
df['sample1_f'] = df['sample1'].fillna(df['sample1'].mean())
print(df)

2.Apply 和自定义函数

计算每行/每列的函数运算结果,例如平均值

python 里的applyaxis = 1表示行,0表示列, 0是默认值

2.1 示例数据

使用 pandas 构建一个数据框:

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd
import numpy as np

# 固定随机种子,保证结果可复现
np.random.seed(42)  
df = pd.DataFrame({
    'student_id': range(1, 11),  # 学生ID
    'student_group':['group1']*5+['group2']*5,
    'math_score': np.random.randint(50, 100, 10),  # 数学分数
    'english_score': np.random.randint(50, 100, 10),  # 英语分数
})
print(df)

2.2 apply + 现有的函数

  • var:方差
  • axis = 1:按行
代码语言:javascript
代码运行次数:0
运行
复制
# 两列求方差
df[['math_score','english_score']].apply('var') 

# 每一行求标准差
df[['math_score','english_score']].apply('std',axis = 1) 

# 现有函数
df[['math_score','english_score']].std(axis=1)

2.3 apply + 自定义函数

  • def:是自定义函数,后面跟函数名称(参数)

自定义一个函数:

代码语言:javascript
代码运行次数:0
运行
复制
def calculate_grade(score):
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    elif score >= 70:
        return 'C'
    elif score >= 60:
        return 'D'
    else:
        return 'F'

3.groupby 完成分组计算

例如:计算 group1 和 group2 组的学生数学平均分是多少

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd
import numpy as np

# 固定随机种子,保证结果可复现
np.random.seed(42)  
df = pd.DataFrame({
    'student_id': range(1, 11),  # 学生ID
    'student_group':['group1']*5+['group2']*5,
    'math_score': np.random.randint(50, 100, 10),  # 数学分数
    'english_score': np.random.randint(50, 100, 10),  # 英语分数
})
print(df)

df.groupby('student_group')['math_score'].mean()

agg()函数:

代码语言:javascript
代码运行次数:0
运行
复制
# 计算group1和group2组学生的数学分数的最小值、最大值、和
# 一列
print(df.groupby("student_group")["math_score"].agg(['min', 'max', 'sum']))

# 多列:数学 和英语
result = df.groupby("student_group").agg({
    "math_score": ["min", "max", "sum"],
    "english_score": ["min", "max", "sum"]
})
print(result)

4.综合应用

4.1 批量读取文件

  • os.listdir()函数:
  • 使用for循环读取
  • 使用推导式读取

index_col=0:第一列读取为行名

代码语言:javascript
代码运行次数:0
运行
复制
import os
import pandas as pd

files = os.listdir('day5/raw_data')
print(files)

# 使用`for`循环读取 
result = []
for x in files:
    result.append(pd.read_table("day5/raw_data/"+x,index_col=0,header = None,names = [x]))
print([x.shape for x in result])

使用推导式去读

代码语言:javascript
代码运行次数:0
运行
复制
import os
import pandas as pd

files = os.listdir('day5/raw_data')
print(files)

# 使用推导式完成读取

result2 = [pd.read_table("day5/raw_data/"+x,index_col=0,header = None,names = [x]) for x in files]

print([x.shape for x in result2])
# 查看一个文件内容
print(result2[0].head())

4.2 合成一个表达矩阵

使用 pd.concat() 函数,axis=1按照列合并

代码语言:javascript
代码运行次数:0
运行
复制
re = pd.concat(result2, axis=1)
print(re.head())
print(re.iloc[0:4,0:4])

4.3 清除不以ENSG开头的行

代码语言:javascript
代码运行次数:0
运行
复制
re = re[re.index.str.startswith('ENSG')]
re.shape

4.4 找出方差最大的10个基因

  • axis = 1:按行
  • sort_values:排序
  • ascending = False:降序排列
  • .index:输出行名
代码语言:javascript
代码运行次数:0
运行
复制
re.var(axis = 1).sort_values(ascending = False).head(10).index

更简洁的办法:

  • .nlargest():最大的几个
  • .nsmallest():最小的几个
代码语言:javascript
代码运行次数:0
运行
复制
genes = re.var(axis = 1).nlargest(10).index
print(genes)

genes = re.var(axis = 1).nlargest(10)
print(genes)

第五天的视频刷完~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 课前复习到 30:29
  • plotnine语法
    • 示例数据
    • 1.入门级绘图模版
    • 2.属性设置
      • 2.1 统一设置
      • 2.2 映射:按照数据框的某一列来定义图的某个属性
    • 3.几何对象
    • 4.位置调整
    • 5.坐标系
    • 6.主题
    • 7.保存
    • 8.拼图
  • 下一个知识点 讲解 01:42:28
    • 1.NA缺失值
      • 1.1 判断是否是缺失值
      • 1.2 插补缺失值
    • 2.Apply 和自定义函数
      • 2.1 示例数据
      • 2.2 apply + 现有的函数
      • 2.3 apply + 自定义函数
    • 3.groupby 完成分组计算
    • 4.综合应用
      • 4.1 批量读取文件
      • 4.2 合成一个表达矩阵
      • 4.3 清除不以ENSG开头的行
      • 4.4 找出方差最大的10个基因
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档