Python代码对Dataframe可视化

本文展示了使用python27对dataframe数据进行可视化的常用图的代码和示例。

1. dataframe两列-分别作为xy轴可视化

  1. 已知dataframe中有列column A B C,以column A的取值为横坐标,column B C的取值为纵坐标,进行可视化,python27代码:
import numpy as np
import matplotlib.pyplot as plt

# 从每个 DataFrame 提取数据并排序
result1 = dt.select('column A', 'column B').orderBy('column A').collect()
result2 = dt.select('column A', 'column C').orderBy('column A').collect()

# 计算每个数据集的均值
mean1 = np.mean([row['column B'] for row in result1])
mean2 = np.mean([row['column C'] for row in result2])

# 提取行和对应的列数据
x1 = [row['column A'] for row in result1]
y1 = [row['column B'] for row in result1]

x2 = [row['column A'] for row in result2]
y2 = [row['column C'] for row in result2]

# 创建折线图
plt.figure(figsize=(12, 8))

# 绘制每条折线
plt.plot(x1, y1, marker='o', color='skyblue', label='column B (mean: {:.2f})'.format(mean1))
plt.plot(x2, y2, marker='o', color='red', label='column C (mean: {:.2f})'.format(mean2))

# 设置标题和标签
plt.title('Title', fontsize=16)
plt.xlabel('column A', fontsize=14)
plt.ylabel('value of column B C', fontsize=14)

# 显示图例
plt.legend(title='column BC')

# 显示网格和图表
#plt.grid(True)
plt.show()

示例图片:
在这里插入图片描述

注意:若想展示更多column BCD…随着column A的变化,增加plt.plot即可。对比配色参考:
‘red’,‘pink’,‘skyblue’, ‘#1f77b4’ 分别表示:深红浅红,深蓝浅蓝

  1. 添加趋势线
    对column B进行线性拟合并给出趋势线
import numpy as np
import matplotlib.pyplot as plt

# 模拟数据生成(替换实际从DataFrame中提取的数据)
np.random.seed(0)  # 设置随机种子以获得可重现的结果
x1 = np.sort(np.random.rand(100) * 100)  # 模拟的'column A'数据,范围在0到100之间
y1 = 3 * x1 + 10 + np.random.randn(100) * 20  # 模拟的'column B'数据,基于一个线性关系加上一些随机噪声

# 计算均值
mean1 = np.mean(y1)

# 拟合线性趋势线
coefficients = np.polyfit(x1, y1, 1)  # 1表示线性拟合
polynomial = np.poly1d(coefficients)

# 创建折线图
plt.figure(figsize=(12, 8))

# 绘制原始数据点
plt.scatter(x1, y1, color='skyblue', label='Original Data')

# 绘制拟合的线性趋势线
x_values = np.linspace(0, 100, 100)  # 生成一个用于绘制趋势线的x值范围
y_values = polynomial(x_values)  # 使用拟合的多项式计算y值
plt.plot(x_values, y_values, color='red', label='Linear Fit')

# 设置标题和标签
plt.title('Linear Fit', fontsize=16)
plt.xlabel('column A', fontsize=14)
plt.ylabel('value of column B', fontsize=14)

# 显示图例
plt.legend(title='Data and Fit')

# 显示网格和图表
#plt.grid(True)
plt.show()

示例图片:
在这里插入图片描述
注意:在numpy.polyfit函数中,第三个参数deg表示拟合多项式的度数。deg决定了多项式的最高次幂。例如:deg=0/1/2/3,…分别表示常数拟合/线性拟合/二次拟合/三次拟合,…以此类推。deg参数可以是任何非负整数,具体取决于希望拟合的数据的复杂性和认为数据背后可能存在的模型。如果不确定应该使用哪个度数,可以尝试不同的值,并使用一些评估指标(如R-squared、调整后的R-squared、AIC、BIC等)来比较不同模型的拟合效果。

  1. 双轴
    右侧增加y轴,表示对dataframe的ratio列值的累加
import numpy as np
import matplotlib.pyplot as plt

# 从每个 DataFrame 提取数据并排序
result1 = dt.select('column A', 'column B').orderBy('column A').collect()
result2 = dt.select('column A', 'column C').orderBy('column A').collect()

# 计算每个数据集的均值
mean1 = np.mean([row['column B'] for row in result1])
mean2 = np.mean([row['column C'] for row in result2])

# 提取行和对应的列数据
x1 = [row['column A'] for row in result1]
y1 = [row['column B'] for row in result1]

x2 = [row['column A'] for row in result2]
y2 = [row['column C'] for row in result2]

# 右侧y轴的数据
x3 = [row['column A'] for row in result2]
y3 = [row['column D'] for row in result2]

# 创建折线图
plt.figure(figsize=(12, 8))

# 创建左侧y轴
ax1 = plt.gca()  # 获取当前的Axes对象

# 在左侧y轴绘制每条折线
ax1.plot(x1, y1, marker='o', color='skyblue', label='column B (mean: {:.2f})'.format(mean1))
ax1.plot(x2, y2, marker='o', color='red', label='column C (mean: {:.2f})'.format(mean2))

# 设置左侧y轴的标签
ax1.set_ylabel('value of column B C', fontsize=14)
#ax1.set_ylim(0, 0)  # 设置左侧y轴的范围为0到1

# 创建右侧y轴,共享同一个x轴
ax2 = ax1.twinx()  

# 在第二个y轴上绘制y3的数据
# 直接绘制
#ax2.plot(x3, y3, linestyle='--', marker='o', color='yellow', label='ratio')
# 绘制累加后的ratio折线
cumulative_ratio = np.cumsum(y3)  # 计算ratio的累加值
ax2.plot(x3, cumulative_ratio, linestyle='--', marker='o', markersize='3', color='black', label='cumulative ratio')

# 设置右侧y轴的标签
ax2.set_ylabel('cumulative ratio', fontsize=14)
ax2.set_ylim(0, 1.1)  # 设置右侧y轴的范围为0到1

# 设置标题和x轴标签
plt.title('Title', fontsize=16)
plt.xlabel('column A', fontsize=14)

# 显示两个坐标轴的图例(注意分别调用两次legend,并设置loc参数以避免重叠)
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines + lines2, labels + labels2, loc='upper left')  # 合并两个图例并显示

# 显示网格和图表
#plt.grid(True)
plt.show()

示例图片:
在这里插入图片描述

2. dataframe两列-按照某列分类别可视化

  1. 已知dataframe中有列class和column B,class的取值有1和-1两类,想把这两类对应的column B的取值分布,画到一个图里。python27代码:
# 把两类对象class 1和-1 在column B 的取值分布 画到一个图里
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 模拟数据
np.random.seed(0)  # 设置随机种子以获得可重复的结果
data = {
    'class': np.random.choice([-1, 1], size=1000),  # 随机生成1000个-1或1的值
    'column B': np.random.randn(1000) * 50 + 100  # 随机生成1000个正态分布的值,均值为100,标准差为50
}
df = pd.DataFrame(data)

# 绘制图形
plt.figure(figsize=(10, 6))
df_pos = df[df['class'] == 1]['column B']
df_neg = df[df['class'] == -1]['column B']
plt.hist(df_pos, bins=50, alpha=0.5, label="class 1", color='blue')
plt.hist(df_neg, bins=50, alpha=0.5, label="class -1", color='red')

# 设置横坐标为 100 的整数倍
max_value = int(max(df['column B'].max(), 100))
x_ticks = range(0, max_value + 100, 100)  # 在Python 2中,range返回列表,而在Python 3中,它返回range对象
plt.xticks(x_ticks)

plt.xlabel('column B')
plt.ylabel('Frequency')
plt.title('Distribution of column B by different classes')
plt.legend()

# 显示图形
plt.show()

示例图片:
在这里插入图片描述

  1. 对dataframe的某列进行数据透视后,再可视化:
    2.1 单独一个
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum as _sum
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 初始化SparkSession
spark = SparkSession.builder.appName("PivotExample").getOrCreate()

# 生成模拟数据
np.random.seed(0)  # 设置随机数种子以确保结果可复现
data = [
    ('groupA', -1, np.random.randint(10, 50)) for _ in range(100)
] + [
    ('groupB', 1, np.random.randint(10, 50)) for _ in range(100)
] + [
    ('groupC', -1 if np.random.rand() < 0.5 else 1, np.random.randint(10, 50)) for _ in range(100)
]

# 创建Spark DataFrame
columns = ['group', 'class', 'cnt']
dt = spark.createDataFrame(data=data, schema=columns)

# 使用groupBy和agg方法进行数据透视
pivot_df = dt.groupBy('group', 'class') \
    .agg(_sum('cnt').alias('total_cnt'))

# 将pyspark DataFrame转换为pandas DataFrame
pivot_pd = pivot_df.toPandas()

# 创建透视表(填充0值)
pivot_table = pivot_pd.pivot(index='group', columns='class', values='total_cnt').fillna(0)

# 绘制折线图(双柱状图bar,折线图line)
pivot_table.plot(kind='line', figsize=(12, 6), title='Count by Group and Class', marker='o')

# 设置图表标签
plt.ylabel('Count')
plt.xlabel('Group')
# 注意:图例的标签应该根据实际的'class'列值来设置,这里假设只有-1和1两个类
plt.legend(title='Class')
plt.tight_layout()

# 显示图表
plt.show()

# 停止SparkSession
spark.stop()

示例图片:
在这里插入图片描述
2.2 向图标中添加两条class曲线的均值
在以上代码中增加均值计算,并修改plt.legend():

# 计算均值
mean_values = pivot_table.mean()

# 更新图例,添加均值信息
plt.legend(title='Class', 
           labels=['-1 (mean: {:.2f})'.format(mean_values[-1]), 
                   '1 (mean: {:.2f})'.format(mean_values[1])])

示例图片:
在这里插入图片描述
2.3 写成for循环的形式,dataframe的多个列column1,2,3,4 都进行透视并可视化

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum as _sum
import pandas as pd
import matplotlib.pyplot as plt

# 要可视化的列名
columns_to_plot = [
    'column1', 
    'column2', 
    'column3', 
    'column4'
]

# 使用 groupBy 和 agg 方法进行数据透视
pivot_df = dt.groupBy('group', 'class') \
    .agg(*[(_sum(col_name).alias(col_name)) for col_name in columns_to_plot])

# 将 pyspark DataFrame 转换为 pandas DataFrame
pivot_pd = pivot_df.toPandas()

# 创建透视表并绘图
for column in columns_to_plot:
    # 创建透视表
    pivot_table = pivot_pd.pivot(index='group', columns='class', values=column).fillna(0)
    
    # 过滤掉值为0的数据
    pivot_table = pivot_table[pivot_table != 0].dropna()
    
    # 计算均值
    mean_values = pivot_table.mean()

    # 绘制折线图,并添加标记
    ax = pivot_table.plot(kind='line', figsize=(12, 6), title=column, marker='o')

    # 设置图表标签
    plt.ylabel(column, fontsize=14)
    plt.xlabel('Group', fontsize=14)

    # 设置标题
    plt.title(column, fontsize=16)

    # 更新图例,添加均值信息
    plt.legend(title='Class', 
               labels=['-1 (mean: {:.2f})'.format(mean_values[-1]), 
                       '1 (mean: {:.2f})'.format(mean_values[1])],
               fontsize=14)
    
    plt.tight_layout()
    
    # 显示图表
    plt.show()

补充

  1. 看dataframe两列的线性相关性:
result = dt.toPandas()
feature = ' column1'
corr_value = result[feature].corr(result['column2'])  
print(f"特征'{feature}'与column2之间的相关性为: {corr_value}")

2025年2月12日第一次发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值