Matlab绘制3D直方图:基于用户-电影评分CSV数据的实现问询
实现用户-电影评分3D直方图的MATLAB方案
你已经有了基础代码框架,但要实现「用户→y轴、电影→x轴、评分→z轴」的3D映射,核心是先把长格式的CSV评分数据转换成矩阵格式——因为bar3需要二维矩阵作为输入:行对应y轴(用户)、列对应x轴(电影),矩阵元素就是对应的评分值。下面是一步步的实现提示和完整代码:
步骤1:加载并预处理数据
你的CSV是逗号分隔的纯数值数据,先用readmatrix加载(兼容性比load更好),然后处理非连续的userID和movieID——因为真实数据里的用户/电影ID通常不是连续的,直接用ID做矩阵索引会生成稀疏矩阵,所以我们把它们转换成连续索引:
% 加载CSV数据(假设文件无表头,直接是userID,movieID,rating三列) TrainingData = readmatrix('ratings.csv'); % 拆分三列数据 userIDs = TrainingData(:, 1); movieIDs = TrainingData(:, 2); ratings = TrainingData(:, 3); % 将非连续的用户/电影ID映射为连续索引 [uniqueUsers, ~, userIdx] = unique(userIDs); [uniqueMovies, ~, movieIdx] = unique(movieIDs); % 创建评分矩阵:行=用户,列=电影,填充对应评分 ratingMatrix = zeros(length(uniqueUsers), length(uniqueMovies)); for i = 1:length(ratings) ratingMatrix(userIdx(i), movieIdx(i)) = ratings(i); end
步骤2:绘制3D直方图并调整轴映射
现在用bar3绘制矩阵,再手动设置轴标签和真实ID刻度,确保映射关系符合你的需求:
figure bar3(ratingMatrix) % 设置轴标签与标题 xlabel('Movie ID') ylabel('User ID') zlabel('Rating') title('User-Movie Rating Distribution') % 把轴刻度替换为真实的用户/电影ID(避免显示连续索引) set(gca, 'XTick', 1:length(uniqueMovies), 'XTickLabel', uniqueMovies) set(gca, 'YTick', 1:length(uniqueUsers), 'YTickLabel', uniqueUsers) % 可选:调整视角让图表更易读 view(45, 30)
关键细节说明
- 为什么要转矩阵?你的原始数据是「长格式」(每一行一条评分记录),而
bar3需要「宽格式」矩阵才能实现用户→y轴、电影→x轴的映射。 - 处理非连续ID:如果直接用原始ID做矩阵索引,会出现大量空白行/列,用
unique生成连续索引能避免稀疏问题,同时保留真实ID的对应关系。 - 满足10行数据要求:你提供的示例有21条记录,运行代码后会完整展示所有用户对电影1的评分分布。
内容的提问来源于stack exchange,提问作者NaveganTeX
相关产品推荐
相关产品推荐

