【python】使用pandas dataframe.plot直接画箱图

文章目录

  • 使用dataframe直接画箱图
    • ① 调整绘制箱图参数
    • ② 设置坐标轴
    • ③ 图中添加文本或直线
    • ④ 更多参数
    • ⑤ 散点图+箱图

使用dataframe直接画箱图

比如,有如下一组数据,直接使用dataframe.plot画图 【官网了解更多】:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv(yourfile, sep='\t', header=0, index_col=0)
df.head()
df.plot(kind='box')
plt.show()

【python】使用pandas dataframe.plot直接画箱图_第1张图片

① 调整绘制箱图参数

df.plot(kind='box',  # 选择画图类型
        title='box title',   # 图名称
        showmeans=True,  # 显示均值
        meanline=True,  # 均值线,True:使用虚线,False使用红色小三角
        showfliers=True,  # 是否显示异常值 
        rot=60, # 坐标值倾斜程度
        figsize=(15,5),  # 画图的大小
        )

使用kind参数选择画图类型:
【python】使用pandas dataframe.plot直接画箱图_第2张图片
显示均值时,设置显示线型:meanline=True
【python】使用pandas dataframe.plot直接画箱图_第3张图片
设置meanline=False:均值显示为小三角
【python】使用pandas dataframe.plot直接画箱图_第4张图片

② 设置坐标轴

y轴设置:(x轴同理)

plt.ylabel('y label')  # 设置y轴名称
plt.ylim([-2, 10])   # 设置y轴范围

【python】使用pandas dataframe.plot直接画箱图_第5张图片

plt.yticks([-2,3,5])  # 只显示指定坐标值

【python】使用pandas dataframe.plot直接画箱图_第6张图片

③ 图中添加文本或直线

plt.text(3, 5, 'text',  # 在坐标(3,5)处添加文本"text"
         fontsize=15,  # 设置字体大小
         color='red',  # 设置为红色
         alpha=0.5,  # 显示透明度
         )
# 也可以将文本写在图之外:(设置相应坐标即可)
plt.text(5, 2, 'new text',  # 在坐标(3,5)处添加文本"text"
         fontsize=15,  # 设置字体大小
         color='red',  # 设置为红色
         alpha=0.5,  # 显示透明度
         )
plt.plot((2.5,2.5), (0,5),   # 直线横坐标x是从2.5->2.5, 纵坐标y是从0-5
         color='orange',   # 设置为橙色
         alpha=0.5,   # 设置透明度
         linewidth=1,  # 设置线条粗细
        )

【python】使用pandas dataframe.plot直接画箱图_第7张图片

④ 更多参数

对特定图,有特定的模块与对应的参数,比如箱图boxplot:箱图参数。所以也可以将这些参数作为dataframe.plot的参数使用。
【python】使用pandas dataframe.plot直接画箱图_第8张图片
【python】使用pandas dataframe.plot直接画箱图_第9张图片
》上图截图来源:https://zhuanlan.zhihu.com/p/38199913

⑤ 散点图+箱图

展示两个数据对应的箱图组合,示例:
【python】使用pandas dataframe.plot直接画箱图_第10张图片

import matplotlib.pyplot as plt
import random


def random_lst(a, b, n):
    lst = []
    for i in range(n):
        lst.append(random.uniform(a, b))
    return lst


def data_plt(df1, df2, idx_lst):
	fig, axs = plt.subplots(nrows=4, ncols=5, figsize=(12, 10), sharex=True) # , sharey=True)
	
	for i in range(len(idx_lst)):
	    cx = i // 5  # 每行5个图
	    rx = i % 5
	    # print(cx, rx)
	    idx_name = idx_lst[i]
	    axs[cx, rx].scatter(random_lst(0.75, 1.25, len(df1[idx_name])) + random_lst(1.75, 2.25, len(df2[idx_name])),
	                        list(df1[idx_name]) + list(df2[idx_name]), s=5, c='C7', alpha=0.4)
	    axs[cx, rx].boxplot([df1[idx_name], df2[idx_name]], 
	                        labels=['A', 'B'], showmeans=True, meanline=False, showfliers=True, widths=0.5)
	    axs[cx, rx].set_title(idx_name, fontsize=10)
	    axs[cx, rx].grid(axis="y")
	
	    plt.xlim(0, 3)
	    plt.xticks([1, 2], ['A', 'B'])
	plt.show()

idx_lst = ...  # list, 两个dataframe要选择的列
dataf1 = ...  # dataframe, data1
dataf2 = ...  # dataframe, data2
data_plt(dataf1, dataf2, idx_lst)

使用seaborn绘制箱图+散点图:

import seaborn as sns

# 创建示例数据
data1 = [1, 2, 3, 4, 5]
data2 = [2, 4, 6, 8, 10]

# 合并两组数据
combined_data = [data1, data2]

# 绘制箱线图
sns.boxplot(data=combined_data)

# 添加散点图
for i, data in enumerate(combined_data):
    sns.stripplot(x=[i]*len(data), y=data, color='red', alpha=0.4)

# 显示图形
plt.show()

【python】使用pandas dataframe.plot直接画箱图_第11张图片

有多个子图:

import seaborn as sns
import matplotlib.pyplot as plt

# 创建示例数据
data1 = [1, 2, 3, 4, 5]
data2 = [2, 4, 6, 8, 10]
data3 = [3, 6, 9, 12, 15]
data4 = [4, 8, 12, 16, 20]
data5 = [5, 10, 15, 20, 25]
data6 = [6, 12, 18, 24, 30]
data7 = [7, 14, 21, 28, 35]
data8 = [8, 16, 24, 32, 40]

# 设置图形大小和布局
fig, axs = plt.subplots(2, 2, figsize=(10, 8))

# 绘制子图1
sns.boxplot(data=[data1, data2], width=0.4, ax=axs[0, 0]).set_title('Group 1')
sns.stripplot(data=[data1, data2], color='red', alpha=0.4, size=4, ax=axs[0, 0])

# 绘制子图2
sns.boxplot(data=[data3, data4], width=0.4, ax=axs[0, 1]).set_title('Group 2')
sns.stripplot(data=[data3, data4], color='red', alpha=0.4, size=4, ax=axs[0, 1])

# 绘制子图3
sns.boxplot(data=[data5, data6], width=0.4, ax=axs[1, 0]).set_title('Group 3')
sns.stripplot(data=[data5, data6], color='red', alpha=0.4, size=4, ax=axs[1, 0])

# 绘制子图4
sns.boxplot(data=[data7, data8], width=0.4, ax=axs[1, 1]).set_title('Group 4')
sns.stripplot(data=[data7, data8], color='red', alpha=0.4, size=4, ax=axs[1, 1])

# 调整子图之间的间距
plt.tight_layout()

# 显示图形
plt.show()

【python】使用pandas dataframe.plot直接画箱图_第12张图片

    
def boxplt(df0, df1, label0=0, label1=1, nrows=4, hsize=7, ymax=None):
    names = df0.columns
    fig, axs = plt.subplots(nrows=nrows, ncols=5, figsize=(9, hsize))  # , sharex=True) # , sharey=True)
    for i, idx_name in enumerate(names):
        cx = i // 5
        rx = i % 5
        
        # 添加散点图
        sns.stripplot(data=[list(df0[idx_name]), list(df1[idx_name])], ax=axs[cx, rx], 
                      palette='dark:black', 
                      alpha=0.4,  # 点颜色透明度
                      size=2,  # 点大小
                      jitter=0.2,  # 点分散程度(小数值,越大越分散)
                      )
        
        # 添加箱图
        sns.boxplot(data=[list(df0[idx_name]), list(df1[idx_name])], ax=axs[cx, rx],
                    showmeans=True,  #箱图显示均值
                    width=0.5,  #设置箱子之间距离,为1时,每个箱子之间距离为0
                    showfliers=False,  #异常值关闭显示(有散点图显示,避免重复)
                   )
        # box_uni = axs[cx, rx].boxplot([df0[idx_name], df1[idx_name]], 
        #                                 labels=[label0, label1], showmeans=True, meanline=False, showfliers=True, 
        #                                 # notch=True, patch_artist=True,
        #                              )
        
        axs[cx, rx].set_title(idx_name, fontsize=8)
        axs[cx, rx].grid(axis="y")
        if ymax is not None:
            axs[cx, rx].set_ylim(0, ymax) # (0, 0.1) # (0, 0.5)
    plt.show()

附:python画图示例官网:matplotlib https://matplotlib.org/stable/gallery/index.html


数据的处理

  • 取log
df2 = np.log2(df+0.0001)  # 将数值取log

【python】使用pandas dataframe.plot直接画箱图_第13张图片

  • zscore:
from scipy import stats
df.shape[0]  # 行数
df.shape[1]  # 列数
zs_arr = stats.zscore(df, axis=1, ddof=0)  # 注意输出的是数组型(array)

【python】使用pandas dataframe.plot直接画箱图_第14张图片

你可能感兴趣的:(python,python,pandas,数据分析)