精华内容
下载资源
问答
  • 论文研究-基于雷达图表示的多维数据可视化分类方法.pdf, 傅立叶描述子是分析和识别物体形状重要方法之一.基于雷达图表示多维数据原理,提出了一种利用傅立叶描述子...
  • 针对传统基于降维映射数据可视化方法计算复杂度高且无法提供维度分布信息缺点,提出一种基于正2k边形的多维数据可视化方法RPES,通过建立多维数据空间低维“参照物”——正2k边形坐标系,以减小多维对象在正2k...
  • 非线性多维数据可视化分类预测方法,李志建,郑新奇,地理信息分类传统线性算法具有正向直接判定快速优势,但局限于对已知数据进行线性判别划分,而非线性未知信息分类预测同
  • 今天浏览了Matlab官网,看了一下官网提供Matlab绘图工具箱,因为很多之前没有注意到,部分虽然...2. 多维数据可视化之气泡图 2.1 加载数据 2.2 3D气泡图 2.3 可点击图例 2.4 七维数据3D可视化效果图 2....

    今天浏览了Matlab官网,看了一下官网提供的Matlab的绘图工具箱,因为很多之前没有注意到,部分虽然自己可以实现,但是功能不够完善,因此,今天做一下工具箱的总结,以用来记录自己的学习过程,详情请移步MathWorks绘图专区入口

    目录

    1. 雷达图

    2. 多维数据可视化之气泡图

    2.1 加载数据

    2.2 3D气泡图

    2.3 可点击图例

    2.4 七维数据的3D可视化效果图

    2.5 五维数据的2D可视化效果图


    1. 雷达图

    雷达图,又称为蜘蛛图,MathWorks中有位大佬提供了具体的画法,这里给出其实例:

    %% Example Script %%%
    % Clear workspace
    close all;
    clearvars;
    clc;
    
    % Point properties
    num_of_points = 6;
    row_of_points = 4;
    
    % Random data
    P = rand(row_of_points, num_of_points);
    
    % Scale points by a factor
    P(:, 2) = P(:, 2) * 2;
    P(:, 3) = P(:, 3) * 3;
    P(:, 4) = P(:, 4) * 4;
    P(:, 5) = P(:, 5) * 5;
    
    % Make random values negative
    P(1:3, 3) = P(1:3, 3) * -1;
    P(:, 5) = P(:, 5) * -1;
    
    % Create generic labels
    P_labels = cell(num_of_points, 1);
    
    for ii = 1:num_of_points
    P_labels{ii} = sprintf('Label %i', ii);
    end
    
    % Figure properties
    figure('units', 'normalized', 'outerposition', [0 0.05 1 0.95]);
    
    % Axes properties
    axes_interval = 2;
    axes_precision = 1;
    
    % Spider plot
    spider_plot(P, P_labels, axes_interval, axes_precision,...
    'Marker', 'o',...
    'LineStyle', '-',...
    'LineWidth', 2,...
    'MarkerSize', 5);
    
    % Title properties
    title('Sample Spider Plot',...
    'Fontweight', 'bold',...
    'FontSize', 12);
    
    % Legend properties
    legend('show', 'Location', 'southoutside');

    笔者喜欢一步到位,下面是雷达图实现的源码,后期可能更新有所不同,不过只要知道大概意思就行,大家可以在次基础上改:

    function spider_plot(P, P_labels, axes_interval, axes_precision, varargin)
    % Create a spider web or radar plot with an axes specified for each column
    %
    % spider_plot(P, P_labels, axes_interval, axes_precision) creates a spider
    % web plot using the points specified in the array P. The column of P
    % contains the data points and the rows of P contain the multiple sets of
    % data points. Each point must be accompanied by a label specified in the
    % cell P_labels. The number of intervals that separate the axes is
    % specified by axes_interval. The number of decimal precision points is
    % specified by axes_precision.
    % 
    % P - [vector | matrix]
    % P_labels - [cell of string]
    % axes_interval - [integer]
    % axes_precision - [integer]
    %
    % spider_plot(P, P_labels, axes_interval, axes_precision, line_spec) works
    % the same as the function above. Additional line properties can be added
    % in the same format as the default "plot" function in MATLAB.
    %
    % line_spec - [character vector]
    %
    % %%%%%%%%%%%%%%%%%%% Example of a Generic Spider Plot %%%%%%%%%%%%%%%%%%%
    % % Clear workspace
    % close all;
    % clearvars;
    % clc;
    % 
    % % Point properties
    % num_of_points = 6;
    % row_of_points = 4;
    %
    % % Random data
    % P = rand(row_of_points, num_of_points);
    %
    % % Scale points by a factor
    % P(:, 2) = P(:, 2) * 2;
    % P(:, 3) = P(:, 3) * 3;
    % P(:, 4) = P(:, 4) * 4;
    % P(:, 5) = P(:, 5) * 5;
    %
    % % Make random values negative
    % P(1:3, 3) = P(1:3, 3) * -1;
    % P(:, 5) = P(:, 5) * -1;
    % 
    % % Create generic labels
    % P_labels = cell(num_of_points, 1);
    % 
    % for ii = 1:num_of_points
    %     P_labels{ii} = sprintf('Label %i', ii);
    % end
    % 
    % % Figure properties
    % figure('units', 'normalized', 'outerposition', [0 0.05 1 0.95]);
    % 
    % % Axes properties
    % axes_interval = 2;
    % axes_precision = 1;
    % 
    % % Spider plot
    % spider_plot(P, P_labels, axes_interval, axes_precision,...
    %     'Marker', 'o',...
    %     'LineStyle', '-',...
    %     'LineWidth', 2,...
    %     'MarkerSize', 5);
    % 
    % % Title properties
    % title('Sample Spider Plot',...
    %     'Fontweight', 'bold',...
    %     'FontSize', 12);
    % 
    % % Legend properties
    % legend('show', 'Location', 'southoutside');
    % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %%% Point Properties %%%
    % Number of points
    [row_of_points, num_of_points] = size(P);
    
    %%% Error Check %%%
    % Check if axes properties are an integer
    if floor(axes_interval) ~= axes_interval || floor(axes_precision) ~= axes_precision
        error('Error: Please enter in an integer for the axes properties.');
    end
    
    % Check if axes properties are positive
    if axes_interval < 1 || axes_precision < 1
        error('Error: Please enter value greater than one for the axes properties.');
    end
    
    % Check if the labels are the same number as the number of points
    if length(P_labels) ~= num_of_points
        error('Error: Please make sure the number of labels is the same as the number of points.');
    end
    
    % Pre-allocation
    max_values = zeros(1, num_of_points);
    min_values = zeros(1, num_of_points);
    axis_increment = zeros(1, num_of_points);
    
    % Normalized axis increment
    normalized_axis_increment = 1/axes_interval;
    
    % Iterate through number of points
    for ii = 1:num_of_points
        % Group of points
        group_points = P(:, ii);
        
        % Max and min value of each group
        max_values(ii) = max(group_points);
        min_values(ii) = min(group_points);
        range = max_values(ii) - min_values(ii);
        
        % Axis increment
        axis_increment(ii) = range/axes_interval;
        
        % Normalize points to range from [0, 1]
        P(:, ii) = (P(:, ii)-min(group_points))/range;
        
        % Shift points by one axis increment
        P(:, ii) = P(:, ii) + normalized_axis_increment;
    end
    
    %%% Polar Axes %%%
    % Polar increments
    polar_increments = 2*pi/num_of_points;
    
    % Normalized  max limit of axes
    axes_limit = 1;
    
    % Shift axes limit by one axis increment
    axes_limit = axes_limit + normalized_axis_increment;
    
    % Polar points
    radius = [0; axes_limit];
    theta = 0:polar_increments:2*pi;
    
    % Convert polar to cartesian coordinates
    [x_axes, y_axes] = pol2cart(theta, radius);
    
    % Plot polar axes
    grey = [1, 1, 1] * 0.5;
    h = line(x_axes, y_axes,...
        'LineWidth', 1,...
        'Color', grey);
    
    % Iterate through all the line handles
    for ii = 1:length(h)
        % Remove polar axes from legend
        h(ii).Annotation.LegendInformation.IconDisplayStyle = 'off';
    end
    
    %%% Polar Isocurves %%%
    % Shifted axes interval
    shifted_axes_interval = axes_interval+1;
    
    % Incremental radius
    radius = (0:axes_limit/shifted_axes_interval:axes_limit)';
    
    % Convert polar to cartesian coordinates
    [x_isocurves, y_isocurves] = pol2cart(theta, radius);
    
    % Plot polar isocurves
    hold on;
    h = plot(x_isocurves', y_isocurves',...
        'LineWidth', 1,...
        'Color', grey);
    
    % Iterate through all the plot handles
    for ii = 1:length(h)
        % Remove polar isocurves from legend
        h(ii).Annotation.LegendInformation.IconDisplayStyle = 'off';
    end
    
    %%% Figure Properties %%%
    colors = [0, 0.4470, 0.7410;...
        0.8500, 0.3250, 0.0980;...
        0.9290, 0.6940, 0.1250;...
        0.4940, 0.1840, 0.5560;...
        0.4660, 0.6740, 0.1880;...
        0.3010, 0.7450, 0.9330;...
        0.6350, 0.0780, 0.1840];
    
    % Repeat colors is necessary
    repeat_colors = fix(row_of_points/size(colors, 1))+1;
    colors = repmat(colors, repeat_colors, 1);
    
    %%% Data Points %%%
    % Iterate through all the rows
    for ii = 1:row_of_points
        % Convert polar to cartesian coordinates
        [x_points, y_points] = pol2cart(theta(1:end-1), P(ii, :));
        
        % Make points circular
        x_circular = [x_points, x_points(1)];
        y_circular = [y_points, y_points(1)];
        
        % Plot data points
        plot(x_circular, y_circular,...
            'Color', colors(ii, :),...
            'MarkerFaceColor', colors(ii, :),...
            varargin{:});
    end
    
    %%% Axis Properties %%%
    % Figure background
    fig = gcf;
    fig.Color = 'white';
    
    % Iterate through all the number of points
    for hh = 1:num_of_points
        % Shifted min value
        shifted_min_value = min_values(hh)-axis_increment(hh);
        
        % Axis label for each row
        row_axis_labels = (shifted_min_value:axis_increment(hh):max_values(hh))';
        
        % Iterate through all the isocurve radius
        for ii = 2:length(radius)
            % Display axis text for each isocurve
            text(x_isocurves(ii, hh), y_isocurves(ii, hh), sprintf(sprintf('%%.%if', axes_precision), row_axis_labels(ii)),...
                'Units', 'Data',...
                'Color', 'k',...
                'FontSize', 10,...
                'HorizontalAlignment', 'center',...
                'VerticalAlignment', 'middle');
        end
    end
    
    % Label points
    x_label = x_isocurves(end, :);
    y_label = y_isocurves(end, :);
    
    % Shift axis label
    shift_pos = 0.07;
    
    % Iterate through each label
    for ii = 1:num_of_points
        % Angle of point in radians
        theta_point = theta(ii);
        
        % Find out which quadrant the point is in
        if theta_point == 0
            quadrant = 0;
        elseif theta_point == pi/2
            quadrant = 1.5;
        elseif theta_point == pi
            quadrant = 2.5;
        elseif theta_point == 3*pi/2
            quadrant = 3.5;
        elseif theta_point == 2*pi
            quadrant = 0;
        elseif theta_point > 0 && theta_point < pi/2
            quadrant = 1;
        elseif theta_point > pi/2 && theta_point < pi
            quadrant = 2;
        elseif theta_point > pi && theta_point < 3*pi/2
            quadrant = 3;
        elseif theta_point > 3*pi/2 && theta_point < 2*pi
            quadrant = 4;
        end
        
        % Adjust text alignment information depending on quadrant
        switch quadrant
            case 0
                horz_align = 'left';
                vert_align = 'middle';
                x_pos = shift_pos;
                y_pos = 0;
            case 1
                horz_align = 'left';
                vert_align = 'bottom';
                x_pos = shift_pos;
                y_pos = shift_pos;
            case 1.5
                horz_align = 'center';
                vert_align = 'bottom';
                x_pos = 0;
                y_pos = shift_pos;
            case 2
                horz_align = 'right';
                vert_align = 'bottom';
                x_pos = -shift_pos;
                y_pos = shift_pos;
            case 2.5
                horz_align = 'right';
                vert_align = 'middle';
                x_pos = -shift_pos;
                y_pos = 0;
            case 3
                horz_align = 'right';
                vert_align = 'top';
                x_pos = -shift_pos;
                y_pos = -shift_pos;
            case 3.5
                horz_align = 'center';
                vert_align = 'top';
                x_pos = 0;
                y_pos = -shift_pos;
            case 4
                horz_align = 'left';
                vert_align = 'top';
                x_pos = shift_pos;
                y_pos = -shift_pos;
        end
        
        % Display text label
        text(x_label(ii)+x_pos, y_label(ii)+y_pos, P_labels{ii},...
            'Units', 'Data',...
            'HorizontalAlignment', horz_align,...
            'VerticalAlignment', vert_align,...
            'EdgeColor', 'k',...
            'BackgroundColor', 'w');
    end
    
    % Axis limits
    axis square;
    axis([-axes_limit, axes_limit, -axes_limit, axes_limit]);
    axis off;
    end

    2. 多维数据可视化之气泡图

    真的是很棒,之前虽然笔者也曾写过五维的数据可视化气泡图,相比大佬,自叹望尘莫及:Bubbleplot visualization of multi-dimensional data。该工具箱可以创建2维和三维散点图,最多可以利用颜色、形状、大小以及标注文本可视化七个维度的数据信息。绘制气泡图的工具箱源码如下:

    function [lh, th] = bubbleplot(x, y, z, siz, col, shape, varargin)
    % BUBBLEPLOT produces a scatter plot that enables the visualization of upto 
    % 6-dimensional data. The dimensions used for displaying data include the 
    % X, Y and Z coordinates, the marker size, color and shape. 
    %
    % USAGE: 
    % BUBBLEPLOT(x, y, z, siz, col, shape)
    %    draws a 3D bubble plot. See input parameter description below.
    %
    % BUBBLEPLOT(x, y, [], siz, col, shape)
    %    draws a 2D bubble plot. 
    %
    % BUBBLEPLOT(..., textarray)
    %    enables you to pass in a cell array of strings to annotate each point
    %    on the plot. By default the strings are displayed as text labels as well
    %    as stored in the UserData property of the line objects
    %
    % BUBBLEPLOT(..., textarray, 'ShowText', false)
    %    will not display the text on screen, but will store it in the user
    %    data property. This can be useful when creating a custom data tip.
    %
    % [hLine, hText] = BUBBLEPLOT(...)
    %    returns a vector of line handles to the points in the plot and 
    %    (if appropriate) a vector of handles to the text objects on the
    %    screen.
    %
    % INPUT PARAMETERS:
    % The inputs should be vectors of the same length, with the following
    % requirements:
    %  Input     Required     Default-Value         Type
    % x, y, z      Yes             N/A          Numerical (Continuous or discrete)
    %   siz         No              8           Numerical (Continuous or discrete)
    %   col         No           col = z        Numerical or Categorical*
    %  shape        No             'o'          Categorical* (upto 13 unique discrete values)
    % 
    % NOTES:
    % * "Categorical" variables can either be numeric with discrete values or
    %   non-numeric data types that support a "UNIQUE" method. Examples of this
    %   can be a cell array of strings, a nominal array or ordinal array.
    %
    % * The siz variable is normalized to a marker size range of 3 to 20. To
    %   specify a custom size range use the optional parameter
    %   'markerSizeLimits'. Example: BUBBLEPLOT(..., 'MarkerSizeLimits', [5 32])
    %
    % * The shape variable can also be a character that represents a marker
    %   shape to be used for all points
    %
    % * If col is a categorical variable, ensure it is integer-valued so that
    %   it is handled correctly. If it is not integer valued, BUBBLEPLOT will
    %   check to see if the number of unique values is less than 10% of the
    %   length of the vector and use that to determine if the variable is
    %   categorical. The colors used to depict categorical data are evenly
    %   spaced (1 color level per unique category/label). However if col is
    %   not categorical, its values are simply scaled to different values in
    %   the colormap
    %
    % * The default font size used to display the text labels is 8 pt with a
    %   left alignment. Use the input arguments 'FontSize' and 'Alignment' to
    %   control these properties.
    %   Example: BUBBLEPLOT(..., 'FontSize', 6, 'Alignment', 'center')
    %
    % * You can specify a custom colormap using the Colormap argument. The
    %   parameter can be a string (eg. 'cool'), a function handle (eg. @jet) or 
    %   an N-by-3 matrix of color RGB levels.
    %   Example: BUBBLEPLOT(..., 'ColorMap', cmap)
    
    % Copyright 2009-2014 The MathWorks, Inc.
    
    %% Parse input params and defaults
    
    % Check number of input arguments
    error(nargchk(2,10,nargin,'struct'));
    
    % Default z
    if nargin < 3
        z = [];
    end
    
    % Default size
    if nargin < 4 || isempty(siz)
        siz = 8;
    end
    
    if nargin < 5 || isempty(col)
        col = z;
    end
    
    if nargin < 6 || isempty(shape)
        shape = 'o';
    end
    
    p = inputParser;
    p.addOptional('Text',{},@(x)iscellstr(x)||(ischar(x)&&size(x,1)>1)||(~ischar(x)&&length(x)>1));
    p.addParamValue('ShowText',true);
    p.addParamValue('FontSize',8);
    p.addParamValue('Alignment', 'left');
    p.addParamValue('MarkerSizeLimits',[3 20]);
    p.addParamValue('ColorMap',@cool);
    p.parse(varargin{:});
    desctext = p.Results.Text;
    showText = p.Results.ShowText;
    if isempty(desctext), showText = false; end
    fontSize = p.Results.FontSize;
    alignment = p.Results.Alignment;
    colmapfun = p.Results.ColorMap;
    markerSizeLimits = p.Results.MarkerSizeLimits;
    
    %% Determine marker colors
    if ischar(colmapfun)
        colmapfun = str2func(colmapfun);
    elseif isnumeric(colmapfun)
        colmapfun = @(x)colmapfun(1:min(x,end),:);
    end
        
    if isempty(col)
        col = zeros(size(x));
    end
    [uniqueCols, gar, colInd] = unique(col);
    if isinteger(col) || isa(col,'categorical') || iscell(col) || length(uniqueCols)<=.1*length(col) || all(round(col)==col) % Is col categorical
        % Generate a colormap with one level per unique entry in col
        colmap = colmapfun(length(uniqueCols));
    else
        % Scale the color values to span the colormap
        colmap = colmapfun(256);
        mx = max(col);
        n = min(col);
        if mx == n, mx = n + 1; end
        colInd = (col-n)/(mx-n)*(size(colmap,1)-1)+1;
    end
    try
        color = colmap(round(colInd),:);
    catch %#ok<CTCH>
        error('The custom colormap must have at least %d levels', max(colInd));
    end
    
    %% Determine marker shape
    if ischar(shape)
        markertype = repmat(shape(1),size(x));
    else
        markerseq = 'osd^><vph.*+x';
        [uniqueShapes, gar, shapeInd] = unique(shape);
        if length(uniqueShapes)>length(markerseq)
            error('BubblePlot can only support 13 unique shapes');
        end
        markertype = markerseq(shapeInd);
    end
    
    %% Determine marker size
    if isscalar(siz)
        siz = repmat(siz, size(x));
        markersize = siz;
    else % Map the siz variable to a markersize between a minimum and maximum
        minsize = markerSizeLimits(1);
        maxsize = markerSizeLimits(2);
        markersize = (siz - min(siz))/(max(siz)-min(siz))*(maxsize - minsize)+minsize;
    end
    
    %% Clean up data - handle NaNs
    markersize(isnan(markersize)) = .01; % These will not be drawn as regular markers, just pixel points
    
    %isnan(x) | isnan(y) | isnan(z) | isnan(col) | 
    
    
    %% Plot data
    % Create structure to store original data in every graphics object (for
    % subsequent retrieval, eg: with data tip)
    
    pointData = struct('x',num2cell(x),'y',num2cell(y),'siz',num2cell(siz),'col',num2cell(col),...
        'shape',num2cell(shape));
    
    if nargin > 6 && ~isempty(desctext)
        if ~iscellstr(desctext)
            desctext = cellstr(desctext);
        end
        [pointData.text] = desctext{:};
    end
    
    if isempty(z)
        plotfun = @plot;
        %plotfun = @patch;
        %zarg = {color(1,:)};
        zarg = {};
    else
        plotfun = @plot3;
        zarg = {z(1)};
        zdata = num2cell(z);
        [pointData.z] = zdata{:};
    end
    
    lh = zeros(1,length(x)); % Line Handles
    lh(1) = customPlot(plotfun, pointData(1), color(1,:), markersize(1), markertype(1), x(1), y(1), zarg{:});
    
    for i = 2:length(lh)
        if isempty(z), zarg = {}; else zarg = {z(i)}; end
        %if isempty(z), zarg = {color(i,:)}; else zarg = {z(i)}; end
        lh(i) = customPlot(@line, pointData(i), color(i,:), markersize(i), markertype(i), x(i), y(i), zarg{:});
        %lh(i) = customPlot(@patch, pointData(i), color(i,:), markersize(i), markertype(i), x(i), y(i), zarg{:});
    end
    
    if showText
        hAxes = get(lh(1),'Parent');
        offset = diff(get(hAxes,'Ylim'))*.01;
        if isempty(z)
            z = zeros(size(x));
        end
        th = text(x, y-offset, z, desctext, 'Fontsize', fontSize, 'HorizontalAlignment', alignment);
        lims = get(hAxes,{'XLim','YLim','ZLim'});
        lims = vertcat(lims{:});
        factor = fontSize.*diff(lims,[],2);
        addlistener(hAxes,{'XLim','YLim'},'PostSet',@(obj,evdata)resizeText(hAxes, th, y, factor));
        %addlistener(get(hAxes,'Parent'),'Resize',@(obj,evdata)resizeText(hAxes, th));
    else
        th = [];
    end
    
    
    function lh = customPlot(funh, pointData, c, siz, markertype, varargin)
    lh = funh(varargin{:});
    set(lh, 'Marker', markertype,...
        'LineStyle', 'none', 'Color', c, ...
        'MarkerFaceColor', c, ...
        'MarkerEdgeColor', [0 0 0], 'MarkerSize', siz,...
        'UserData', struct('Point',pointData));
    
    %     lh = patch('XData',x(i),'YData', y(i), 'ZData', z(i), 'Marker', 'o',...
    %     'LineStyle', 'none', 'CData', color, 'MarkerFaceColor', c, ...
    %     'MarkerEdgeColor', [0 0 0], 'MarkerSize', siz2(i), 'FaceAlpha', .4, 'EdgeAlpha', .2, ...
    %     'UserData', data);
    
    function resizeText(hAxes, hText, y, factor) %#ok<*INUSD>
    lims = get(hAxes,{'XLim','YLim','ZLim'});
    lims = vertcat(lims{:});
    % Uncomment following to update fontsize
    % newfs = min([factor(1:2)./diff(lims(1:2,:),[],2) ; 24]);
    % set(hText,'FontSize',newfs);
    
    % Update position
    offset = diff(get(hAxes,'Ylim'))*.01;
    p = get(hText,'Position');
    p = vertcat(p{:});
    outofbounds = any(bsxfun(@gt,p,lims(:,2)') | bsxfun(@lt,p,lims(:,1)'), 2);
    set(hText(outofbounds),'Visible','off');
    set(hText(~outofbounds),'Visible','on');
    
    % Adjust offsets
    p(:,2) = y - offset;
    for i = 1:length(p)
        set(hText(i),'Position',p(i,:));
    end

    2.1 加载数据

    加载随机样本数据:

    load carsmall
    Origin = cellstr(Origin);

    2.2 3D气泡图

    • X: Acceleration (continuous)
    • Y: Horsepower (continuous)
    • Z: MPG (continuous)
    • Size: Weight (continuous)
    • Color: Model_Year (discrete, ordinal)
    • Shape: Origin
    clf
    bubbleplot(Acceleration, Horsepower, MPG, Weight, Model_Year, Origin);
    grid on
    xlabel('Acceleration');ylabel('Horsepower');zlabel('MPG');

    2.3 可点击图例

    可点击图例可以让你能够隐藏或者强调某一组数据,需要用到 clickableLegend 工具箱的源码如下:

    function varargout = clickableLegend(varargin)
    % clickableLegend  Interactive legend for toggling or highlighting graphics
    %
    % clickableLegend is a wrapper around the LEGEND function that provides
    % interactive display toggling or highlighting of lines or patches in a MATLAB
    % plot. It enables you to,
    % * Toggle (hide/show) a graphics object (or group) by clicking on an
    %   associated text label in the legend
    % * Highlight and identify a graphics object (or group) by clicking it. 
    %
    % Its usage is the same as the <a href="matlab: help legend">LEGEND</a> function with additional
    % optional parameters. For further information please see the LEGEND documentation.
    %
    % ADDITIONAL ARGUMENTS specific to clickableLegend:
    % These are passed in as parameter-value pairs
    %
    % * groups: A vector specifying the group membership for every line object.
    %   The grouping parameter lets you have a group of lines represented and
    %   controlled by one entry in the legend. This can be useful if you would
    %   like to highlight or hide a group of lines by clicking on one legend entry.
    %   CONSIDERATIONS:
    %   # The number of unique entries in the group vector must match the
    %     number of strings in the legend
    %   # When passing a vector of line/patch handles as the first input
    %     argument, the vector should contain all lines/patches whose group
    %     membership is included in the group vector. ie. the length of the
    %     vector of handles must match that of the length of the group vector.
    % 
    % * displayedLines: A vector of indices corresponding to the lines or groups that
    %   should be displayed initially. This option is useful if there are too
    %   many lines in the figure and you are only interested in looking at a
    %   few at first.
    %   Example: clickableLegend(..., 'displayedLines', [4 5 6])
    %
    % * plotOptions: A cell array of parameter value pairs that define
    %   properties of the graphics objects in the legend. This can be useful,
    %   for example, to ensure consistent marker sizes within the legend. 
    % 
    % Notes: 
    % 1. If you save the figure and re-load it, the toggling functionality
    % is not automatically re-enabled. To restore it, simply call clickableLegend
    % with no arguments.
    %
    % 2. To prevent the axis from automatically scaling every time a line is
    % turned on and off, issue the command: axis manual
    %
    % Example 1:
    % z = peaks(100);
    % plot(z(:,26:5:50))
    % grid on;
    % axis manual;
    % clickableLegend({'Line1','Line2','Line3','Line4','Line5'}, 'Location', 'NorthWest');
    %
    % Example 2:
    % f = plot([1:10;1:2:20]','x'); hold on;
    % g = plot(sin([1:10;1:2:20]'),'r-');
    % h = plot(11:20,rand(5,10)*5,'b:');
    % clickableLegend([f;g;h], {'Line1','Line2','Line3'},...
    %   'groups', [1 1 2 2 3 3 3 3 3], 'displayedLines', [2 3]);
    %
    % hgsave(gcf, 'testfig.fig');
    % hgload testfig.fig
    % clickableLegend
    %
    % See also legend, clickableLegend_examples
    
    % Copyright 2009-2014 MathWorks, Inc.
    
    % Extract any arguments for clickableLegend
    [dispinds, groupmem, plotOptions, varargin] = ...
        extractOptionalArgs(varargin{:});
    
    % Process group memberships
    [groups, plotObj, varargin] = processGroups(groupmem, varargin{:});
    
    % Create legend
    [varargout{1:nargout(@legend)}] = legend(varargin{:});
    
    % Extract what is needed for the rest of the function and fix varargout
    [leghan, objhan, plothan] = varargout{1:3}; 
    % objhan: strings
    % plothan: graphics objects
    varargout = varargout(1:nargout);
    
    if isempty(groupmem) % Default group membership
        groupmem = 1:length(plothan);
        plotObj = plothan;
        groups = groupmem;
    end
    
    if ~isempty(dispinds) % DisplayedLines parameter was specified
        hidden = true(1, length(plothan));
        dispinds(dispinds>length(plothan)) = [];
        hidden(dispinds) = false;
    end
    
    % Set the callbacks & plot options
    for i = 1:length(plothan)
        set(objhan(i), 'HitTest', 'on', 'ButtonDownFcn',...
            @(varargin)togglevisibility(objhan(i),plotObj(groupmem==groups(i))),...
            'UserData', true);
        if ~isempty(dispinds) && hidden(i)
            togglevisibility(objhan(i), plotObj(groupmem==groups(i)));
        end
        set(plotObj(groupmem==groups(i)), 'HitTest', 'on', 'ButtonDownFcn', ...
            @(varargin)highlightObject(objhan(i),plothan(i),...
                       plotObj(groupmem==groups(i)),plotOptions),...
            'UserData', false);
        if ~isempty(plotOptions)
            set(plothan(i), plotOptions{:}); 
        end
    end
    
    
    function togglevisibility(hObject, obj)
    if get(hObject, 'UserData') % It is on, turn it off
        set(hObject, 'UserData', false);
        set(obj,'HitTest','off','Visible','off','handlevisibility','off');
    else
        set(hObject, 'UserData', true);
        set(obj, 'HitTest','on','visible','on','handlevisibility','on');
    end
    
    function highlightObject(lTextObj, lMarkerObj, plotObj, plotOptions)
    lw = get(plotObj,'LineWidth');
    if ~iscell(lw), lw = {lw}; end;
    ms = get(plotObj,'MarkerSize');
    if ~iscell(ms), ms = {ms}; end;
    
    if ~get(plotObj(1), 'UserData') % It is not selected, highlight it
        %set(hObject, 'FontWeight', 'bold');
        set(lTextObj, 'EdgeColor', 'k');
        set(plotObj, {'LineWidth', 'MarkerSize'}, [cellfun(@(x)x+2, lw, 'Uniformoutput', false) cellfun(@(x)x+2, ms, 'uniformoutput', false)]);
        set(plotObj, 'UserData', true);
    else
        %set(hObject, 'FontWeight', 'normal');
        set(lTextObj, 'EdgeColor', 'none');
        set(plotObj, {'LineWidth', 'MarkerSize'}, [cellfun(@(x)x-2, lw, 'Uniformoutput', false) cellfun(@(x)x-2, ms, 'uniformoutput', false)]);
        set(plotObj, 'UserData', false);
    end
    if ~isempty(plotOptions)
        set(lMarkerObj, plotOptions{:});
    end
    
    function [dispinds, groupmem, plotOpt, varargin] = extractOptionalArgs(varargin)
    % Extract the displayedlines and/or groups arguments if specified
    
    ind = find(strcmpi(varargin,'DisplayedLines'));
    if ~isempty(ind)
        assert(ind<nargin, 'The DisplayedLines parameter value must be specified');
        dispinds = varargin{ind+1};
        varargin(ind:ind+1) = [];
    else
        dispinds = [];
    end
    
    ind = find(strcmpi(varargin,'groups'));
    if ~isempty(ind)
        assert(ind < nargin, 'The groups parameter value must be specified');
        groupmem = varargin{ind+1};
        varargin(ind:ind+1) = [];
    else
        groupmem = [];
    end
    
    ind = find(strcmpi(varargin,'plotoptions'));
    if ~isempty(ind)
        assert(ind < nargin, 'The plotOptions parameter value must be specified');
        plotOpt = varargin{ind+1};
        varargin(ind:ind+1) = [];
    else
        plotOpt = {};
    end
    
    function [groups, obj, varargin] = processGroups(groupmem, varargin)
    if isempty(groupmem)
        groups = []; obj = [];
        return;
    end
    if iscellstr(groupmem)
        groupmem = categorical(groupmem);
    end
    groups = unique(groupmem);
    firstmem = zeros(size(groups));
    if nargin > 1 && ishandle(varargin{1}(1))
        if strcmpi(get(varargin{1}(1),'Type'),'axes')
            hAxes = varargin{1}(1);
            obj = flipud([findobj(hAxes,'Type','line');findobj(hAxes,'Type','patch')]);
        else % It's a line/patch
            obj = varargin{1};
            [~,firstmem] = ismember(groups, groupmem);
            %for i = 1:length(groups)
            %    firstmem(i) = find(groupmem==groups(i),1);
            %end
            varargin{1} = obj(firstmem);
        end
    else
        hAxes = gca;
        obj = flipud([findobj(hAxes,'Type','line');findobj(hAxes,'Type','patch')]);
    end

     实例代码如下:

    clf
    h = bubbleplot(Acceleration, Horsepower, MPG, Weight, Model_Year, Origin);
    grid on
    xlabel('Acceleration');ylabel('Horsepower');zlabel('MPG');
    
    clickableLegend(h, unique(Origin), 'groups', Origin, 'plotOptions', ...
        {'MarkerSize', 8, 'MarkerFaceColor', 'c'});

    2.4 七维数据的3D可视化效果图

    • X: Acceleration (continuous)
    • Y: Horsepower (continuous)
    • Z: MPG (continuous)
    • Size: Weight (continuous)
    • Color: Model_Year (discrete, ordinal)
    • Shape: Cylinders
    • Text: Origin
    clf
    bubbleplot(Acceleration, Horsepower, MPG, Weight, Model_Year, Cylinders,...
                Origin, 'fontSize',6);
    grid on
    xlabel('Acceleration');ylabel('Horsepower');zlabel('MPG');

    2.5 五维数据的2D可视化效果图

    • X: Horsepower (continuous)
    • Y: MPG (continuous)
    • Size: Acceleration (continuous)
    • Color: Displacement (continuous)
    • Shape: Origin
    • Text: Manufacturer
    clf
    h = bubbleplot(Horsepower, MPG, [], Acceleration, Displacement, Origin,...
        Mfg, 'fontSize', 6);
    xlabel('Horsepower');ylabel('MPG');
    grid on;
    clickableLegend(h, unique(Origin), 'groups', Origin, 'plotOptions', ...
        {'MarkerSize', 8, 'MarkerFaceColor', 'c'});

    展开全文
  • 要说多维分析就首先需要了解一下常用分析方法OLAP(OnLine Analysis Processing ,联机分析处理 ) ,OLAP联机分析处理...在DataViz可视化数据分析软件中进行OLAP联机分析处理非常简单,只要简单拖拽就可以实现多...

    要说多维分析就首先需要了解一下常用的分析方法OLAP(OnLine Analysis Processing ,联机分析处理 ) ,OLAP联机分析处理可以让分析人员迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。OLAP的基本多维分析操作有钻取(上卷、下钻)、钻透、切片和切换以及旋转等。

    在DataViz可视化数据分析软件中进行OLAP联机分析处理非常简单,只要简单的拖拽就可以实现多维度数据可视化分析。

    在进行多维分析前,首先我们来了解两个基本概念“维度”和“度量”。

    • 维度:

    在 DataViz产品中,一般情况下,将字符型、时间型字段归纳为“维度”,通过拖拽的形式,我们可以将多个维度创建成一个维度层次,基于维度层次,进行上卷、下钻、钻透等操作。维度层次内部也可以调整层次之间的顺序关系。并且,对于时间维度来说,当拖拽到绑定区域后,自动形成时间维度层次。

    • 度量:

    DataViz产品中将数值型字段归纳为“度量”,也就是我们要统计分析的对象。

    DataViz中进行多维数据可视化分析,可以通过以下方法。

    1. 基于OLAP进行上卷、下钻、切片、切块分析

    OLAP的基本多维分析操作有钻取(上卷、下钻)、钻透、切片和切换以及旋转等。

    • 钻取,即改变维的层次,变换分析的粒度,包括向下钻取(下钻)和向上钻取(上卷),下钻是从汇总数据深入到细节数据进行观察,而上卷则正好相反,是将低层次的细节数据概括到高层次的汇总数据。
    • 切片和切块:是在一部分维上选定值后,关心度量数据在剩余维上的分布。如果剩余的维只有两个,则是切片;如果有三个或以上,则是切块。
    • 旋转:是变换维的方向,即在表格中重新安排维的放置。

    在DataViz中通过拖拽的形式,我们可以将多个维度创建成一个维度层次,基于维度层次,进行上卷、下钻、钻透等操作。维度层次内部也可以调整层次之间的顺序关系。并且,对于时间维度来说,当拖拽到绑定区域后,自动形成时间维度层次。

    如下图,可以通过“下钻到城市”和“上卷至地区”来实现下钻和上卷。

    3f6b652098cbd6895365c9fb2b2648b9.png

    可以通过“详细信息”来实现“数据钻透”,显示数据详细信息

    0ef5d9889a4d6b755323dca15e3d46cd.png

    当我们以某一维度分析数据时,可以添加任意维度或度量的过滤条件,来实现在该维度上切片、切块。

    0ef5d9889a4d6b755323dca15e3d46cd.png

    2. 多表联动

    当进行多维分析时,为了能更清晰的查看分析结果,可以将多表联动和OLAP结合使用。

    b95c463c13e343dda914a1fe2b1cd358.png

    3. 数据透视

    DataViz产品提供了类似Excel数据透视表的功能,也可以通过数据透视表进行多维数据分析。

    4547f3647e50f556aa817a94c7266665.png

    在 DataViz产品中,可以通过多种方式实现多维度数据可视化分析,实现数据的立体式呈现,发现数据中隐藏的价值和规律。

    展开全文
  • 文章目录前言单图中多列数据并列图布局图形并列图形选项卡时间线轮播3d柱状图与热图3d柱状图热图店铺特征矩阵构建散点图平行坐标系 前言 所谓多维,就是数据不仅仅有x,y两列,而是有多列数据特征需要展示。...

    前言

    所谓多维,就是数据不仅仅有x,y两列,而是有多列数据特征需要展示。这里主要分为两类展示方法,一类是用多张图展示多个数据,一类是一张图上展示多列数据。

    导包:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import json
    from pandas.io.json import json_normalize
    from collections import Counter
    

    单图中多列数据并列

    读入数据和数据预处理:

    #导入男鞋数据
    op1=open(r'D:\python学习\数据分析与可视化数据\shoes.json', 'r',encoding='utf-8')
    li=[]
    dict1={}
    for i in op1:
        k=json.loads(i.encode("utf-8"))#把字符串转换为json
        li.append(k)
    a=json_normalize(li)#把由json数据构成的列表转换成数据框
    
    a.groupby("nick").size().sort_values(ascending=False)#按店铺排序,nick是店铺的列名称
    

    在这里插入图片描述
    我们按店铺排序得到了上面的结果,现在计算上面排名前二的两个商家各个款式的对应的商品数量,并且组成矩阵,使得第一列是"意尔康皮鞋旗舰店"对应的商品数量,第二列是"米兰多格商场"的:

    t1=a[a.nick=="意尔康皮鞋旗舰店"].groupby("info.款式").size()#=a[a.nick=="意尔康皮鞋旗舰店"]是导出该店铺的所有数据,groupby("info.款式")表示根据不同款式分组
    t2=a[a.nick=="米兰多格商场"].groupby("info.款式").size()
    p0=pd.concat([t1,t2],axis=1,sort=False).fillna(0)#拼成数据框,concat的好处是可以包容索引不对齐的情况,axis=1表示横向合并,fillna(0)表示不存在的变成0
    

    结果如下:
    在这里插入图片描述
    利用上面的数据做出如下的柱图,注意这里包含了两个商家的数据

    图的布局

    导入作图的包:

    from pyecharts.globals import ThemeType
    from pyecharts.faker import Faker
    from pyecharts import options as opts
    from pyecharts.charts import Bar
    

    把两列数据放在一起:
    只需要增加bar.add_yaxis()

    bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION))
    bar.add_xaxis(p0[0].index.tolist())
    bar.add_yaxis("意尔康皮鞋旗舰店", p0[0].tolist())
    bar.add_yaxis("米兰多格商场", p0[1].tolist())
    bar.set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况"),toolbox_opts=opts.ToolboxOpts())
    bar.render_notebook()
    

    结果如下:
    在这里插入图片描述

    图形的并列

    我们同样也可以让多图在一个界面中显示,做的逻辑就是先分别作图,然后利用一个函数把它们加在一起。

    from pyecharts.faker import Faker
    from pyecharts import options as opts
    from pyecharts.charts import Bar, Grid, Line,Scatter#导入Grid
    
    #先做一个图
    f1=Bar()
    f1.add_xaxis(p0.index.tolist())
    f1.add_yaxis("意尔康皮鞋旗舰店", p0[0].tolist())
    f1.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"), legend_opts=opts.LegendOpts(pos_left="25%"))
    
    #做第二个图
    f2=Bar()
    f2.add_xaxis(p0.index.tolist())
    f2.add_yaxis("米兰多格商场", p0[1].tolist())
    f2.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"), legend_opts=opts.LegendOpts(pos_right="25%"))
    
    #把两个图合并
    g1 = Grid()
    g1.add(f1,grid_opts=opts.GridOpts(pos_left="55%"))
    g1.add(f2,grid_opts=opts.GridOpts(pos_right="55%"))
    g1.render_notebook()
    
    
    

    结果如下:
    在这里插入图片描述

    图形选项卡

    用选项卡的形式做两个图,点哪个选项就出现什么图。实现的逻辑就是先把每一个图做出来,然后用tab函数来运行。

    from pyecharts.charts import Tab#导入Tab
    from pyecharts.components import Table
    
    f1=Bar()
    f1.add_xaxis(p0.index.tolist())
    f1.add_yaxis("意尔康皮鞋旗舰店", p0[0].tolist())
    f1.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
    
    f2=Bar()
    f2.add_xaxis(p0.index.tolist())
    f2.add_yaxis("米兰多格商场", p0[1].tolist())
    f2.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
    
    tab = Tab()
    tab.add(f1, "意尔康皮鞋旗舰店")
    tab.add(f2, "米兰多格商场")
    tab.render_notebook()
    

    结果如下:
    在这里插入图片描述

    时间线轮播

    时间线轮播也是多图的形式,以滚动呈现。

    from pyecharts.charts import Timeline
    
    f1=Bar()
    f1.add_xaxis(p0.index.tolist())
    f1.add_yaxis("意尔康皮鞋旗舰店", p0[0].tolist())
    f1.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
    
    f2=Bar()
    f2.add_xaxis(p0.index.tolist())
    f2.add_yaxis("米兰多格商场", p0[1].tolist())
    f2.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
    
    tl = Timeline()
    tl.add(f1, "意尔康皮鞋旗舰店")
    tl.add(f2, "米兰多格商场")
    tl.render_notebook()
    

    结果如下:
    在这里插入图片描述

    3d柱状图与热图

    • 对于多维数据,3d图是非常形象的表现方法,x,y轴通常表示两个条件限定,z轴(柱的高度)通常表示在这样限定下的数量
    • 注意pyecharts3d柱状图的数据格式,x,y分别对应有哪些类别,通常是一个列表,而data是一个三元列表,前两个为确定哪两个类别,通过序号指代,最后一个为数量
      导包:
    from pyecharts.faker import Faker
    from pyecharts import options as opts
    from pyecharts.charts import Bar3D
    import random
    

    3d柱状图

    根据例子来理解3d柱状图,求出"info.鞋面材质","info.风格"这两个特征下商品的数量

    #因为x、y有很多重复的,所有需要进行一定的处理
    x=[]
    y=[]
    data=[]#data是放x、y 的索引的
    n=0
    for i in p0.items():
        if i[0][0] not in x:
            x.append(i[0][0])
        if i[0][1] not in y:
            y.append(i[0][1])
        data.append([x.index(i[0][0]),y.index(i[0][1]),i[1]])
    
    f3=Bar3D()
    f3.add("",data,
           xaxis3d_opts=opts.Axis3DOpts(x, type_="category"),
           yaxis3d_opts=opts.Axis3DOpts(y, type_="category"),
           zaxis3d_opts=opts.Axis3DOpts(type_="value")
          ).set_global_opts(
            visualmap_opts=opts.VisualMapOpts(max_=20),
            title_opts=opts.TitleOpts(title="Bar3D-基本示例"),
            )
    f3.render_notebook()
    

    结果如下:
    在这里插入图片描述

    热图

    import random
    from pyecharts.faker import  Faker
    from pyecharts import options as opts
    from pyecharts.charts import HeatMap
    
    f4=HeatMap()
    f4.add_xaxis(x)
    f4.add_yaxis("series0", y, data)
    f4.set_global_opts(
                title_opts=opts.TitleOpts(title="HeatMap-基本示例"),
                visualmap_opts=opts.VisualMapOpts(),
            )
    f4.render_notebook()
    

    结果如下:
    在这里插入图片描述

    店铺特征矩阵的构建

    #把商品销量提取出来,并把对应列表的类型转化为数
    a.sales=a.sales.str.split("人",expand=True)[0]
    a.sales = a.sales.astype(np.int64)#转换列的类型为整数
    a.price = a.price.astype(np.float)
    
    #求出各个商品的销售额并把它并入到原始数据框中去
    z1=a.sales*a.price#算出商品的销售额
    z1.name="xse"
    a1=pd.concat([a,z1],axis=1)#给序列命名之后添加入数据框就会直接以序列名作为列标
    
    先做成字典,把各个特征放入字典中
    te_zheng={"nick":[],"z_xse":[],"z_num":[],"p_sales":[],"p_bdj":[],"p_price":[]}
    for i in a1.groupby("nick"):#循环i对应的是店铺的名称,分组里面每一组的商品都属于同一个店的
        te_zheng["nick"].append(i[0])
        te_zheng["z_xse"].append(i[1].xse.sum())
        te_zheng["z_num"].append(len(i[1]))
        te_zheng["p_sales"].append(round(i[1].sales.mean(),1))
        if i[1].sales.sum()==0:#存在除零的情况,所以做判断
            te_zheng["p_bdj"].append(0)
        else:
            te_zheng["p_bdj"].append(round(i[1].xse.sum()/i[1].sales.sum(),1))
        te_zheng["p_price"].append(round(i[1].price.mean(),1))
    
    # 把字典转化为数据框,并基于销售额排序
    df_te_zheng=pd.DataFrame(te_zheng)
    df_te_zheng.sort_values(by="z_xse",ascending=False,inplace=True)
    df_te_zheng.head()
    
    

    结果如下:
    在这里插入图片描述

    散点图

    from pyecharts.charts import Scatter#导入散点图的包
    f1=Scatter()
    f1.add_xaxis(df_te_zheng[0:20].z_xse.tolist())
    f1.add_yaxis("商家A",df_te_zheng[0:20].p_bdj.tolist())
    f1.set_global_opts(xaxis_opts=opts.AxisOpts(type_='value'))#注意pyechart的x轴通常默认为类别轴,需要重新设定为数值轴
    f1.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    f1.render_notebook()
    

    在这里插入图片描述

    平行坐标系

    • 平行坐标系是能够展示数据维度最自由的图形,但是最好对象不要太多
    • 注意平行坐标系的数据格式

    利用商家的特征矩阵,做出排名前五的商家的平行坐标系,并基于适当的分析

    from pyecharts import options as opts
    from pyecharts.charts import Page, Parallel
    z1=df_te_zheng.head(5)
    z1
    for i in z1.iterrows():
        print(i[1].tolist()[1:])
    
    data1=[]
    for i in z1.iterrows():
        data1.append(i[1].tolist()[1:])
    data1
    
    f2=Parallel().add_schema(
                [
                    {"dim": 0, "name": "z_xse"},#注意这里的序号对应于data1中列表的索引
                    {"dim": 1, "name": "z_num"},
                    {"dim": 2, "name": "p_sales"},
                    {"dim": 3, "name": "p_bdj"},
                    {"dim": 4, "name": "p_price"},
                ]
            )
    f2.add("parallel", data1)
    f2.set_global_opts(title_opts=opts.TitleOpts(title="Parallel-基本示例"))
    f2.render_notebook()
    
    

    结果如下:
    在这里插入图片描述

    展开全文
  • 要说多维分析就首先需要了解一下常用分析方法OLAP(OnLine Analysis Processing ,联机分析处理 ) ,OLAP联机分析处理...在DataViz可视化数据分析软件中进行OLAP联机分析处理非常简单,只要简单拖拽就可以实现...

    564c9edb5a8a30366c68580e84e0b448.png

    要说多维分析就首先需要了解一下常用的分析方法OLAP(OnLine Analysis Processing ,联机分析处理 ) ,OLAP联机分析处理可以让分析人员迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。OLAP的基本多维分析操作有钻取(上卷、下钻)、钻透、切片和切块以及旋转等。

    在DataViz可视化数据分析软件中进行OLAP联机分析处理非常简单,只要简单的拖拽就可以实现多维度数据可视化分析。
    在进行多维分析前,首先我们来了解两个基本概念“维度”和“度量”。

    • 维度:

    在 DataViz产品中,一般情况下,将字符型、时间型字段归纳为“维度”,通过拖拽的形式,我们可以将多个维度创建成一个维度层次,基于维度层次,进行上卷、下钻、钻透等操作。维度层次内部也可以调整层次之间的顺序关系。并且,对于时间维度来说,当拖拽到绑定区域后,自动形成时间维度层次。

    • 度量:

    DataViz产品中将数值型字段归纳为“度量”,也就是我们要统计分析的对象。

    DataViz中进行多维数据可视化分析,可以通过以下方法。

    1. 基于OLAP进行上卷、下钻、切片、切块分析
    OLAP的基本多维分析操作有钻取(上卷、下钻)、钻透、切片和切换以及旋转等。

    • 钻取,即改变维的层次,变换分析的粒度,包括向下钻取(下钻)和向上钻取(上卷),下钻是从汇总数据深入到细节数据进行观察,而上卷则正好相反,是将低层次的细节数据概括到高层次的汇总数据。
    • 切片和切块:是在一部分维上选定值后,关心度量数据在剩余维上的分布。如果剩余的维只有两个,则是切片;如果有三个或以上,则是切块。
    • 旋转:是变换维的方向,即在表格中重新安排维的放置。

    在DataViz中通过拖拽的形式,我们可以将多个维度创建成一个维度层次,基于维度层次,进行上卷、下钻、钻透等操作。维度层次内部也可以调整层次之间的顺序关系。并且,对于时间维度来说,当拖拽到绑定区域后,自动形成时间维度层次。

    04df67ea21fb36eb848eaaebd052db60.png

    如下图,可以通过“下钻到城市”和“上卷至地区”来实现下钻和上卷。

    0514bcbc1010a64bf90191e7eb93f79f.png

    可以通过“详细信息”来实现“数据钻透”,显示数据详细信息

    9d34ee6c99c6af7761545b08d5aa3942.png

    当我们以某一维度分析数据时,可以添加任意维度或度量的过滤条件,来实现在该维度上切片、切块。

    ea7999e16e1178a7150adbd85f7f6b73.png

    2. 多表联动

    当进行多维分析时,为了能更清晰的查看分析结果、创建数据分析报告,可以将多表联动和OLAP结合使用。

    0860d24a32ab5e86b1fb0bc2bd4f1471.gif

    3. 数据透视
    DataViz产品提供了类似Excel数据透视表的功能,也可以通过数据透视表进行多维数据分析。

    e5bc23fb1adbca00df4b3c10a64c4e42.gif

    在 DataViz产品中,可以通过多种方式实现多维度数据可视化分析,实现数据的立体式呈现,发现数据中隐藏的价值和规律。

    数据分析软件-大数据分析软件,可视化数据分析软件_东软平台云cloud.neusoft.com
    6fd596aba32701d81b4cbe9d04415c21.png
    展开全文
  • 要说多维分析就首先需要了解一下常用分析方法OLAP(OnLine Analysis Processing ,联机分析处理 ) ,OLAP联机分析处理...在DataViz可视化数据分析软件中进行OLAP联机分析处理非常简单,只要简单拖拽就可以实现...
  • 要说多维分析就首先需要了解一下常用分析方法OLAP(OnLine Analysis Processing ,联机分析处理 ) ,OLAP联机分析处理可以让分析...在DataViz可视化数据分析软件中进行OLAP联机分析处理非常简单,只要简单拖拽就...
  • 大数据可视化是通过图表将隐藏在数据中的信息...有着不同特点的数据,可视化的方法也是多种多样的,同一组数据也可以有截然不同形式的可视化表现。数据可视化的目的是为了方便用户更好地进行模拟与计算。可视化不...
  • .Chernoff face是由美国统计学家Chernoff在1976年率先提出,用脸谱来分析多维度数据,即将P个维度的数据用人脸部位形状或大小来表征。 他首先将该方法用于聚类分析,引起了各国统计学家极大兴趣,并对他...
  • 物理海洋数据可视化分析方法研究,张玉娟,郭东琳,当前物理海洋数据突显出网格模型复杂化、高维、时变、海量发展趋势,在查询统计、制图表达等方面面临严峻挑战。论文在对多维
  • 一. 数据可视化及基本特征 ...4 多维数据可视化 一. 数据可视化及基本特征 数据可视化是数据加工和处理基本方法之一,它通过图形图像 等技术来更为直观地表达数据,从而为发现数据隐含规律提供技术手段..
  • 本节书摘来自异步社区《JavaScript数据可视化编程》一书中第1章第1.6节作者 【美】Stephen A.Thomas 译者 翟东方 , 张超 , 刘畅 责编 陈冀康更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.6 使用雷达图...
  • 基于像素的可视化技术:每一维度创建一个窗口,记录m个维值映射到m个像素,像素颜色深浅代表着对应值。缺点在于对于我们理解多维空间的数据分布帮助不大。  从该图中,可以发现:income与credit_limit为一...
  • 平行坐标是可视化高维几何和分析多元数据的常用方法。此可视化与时间序列可视化密切相关,不同之处在于它适用于轴与时间点不对应且因此没有自然顺序的数据。因此,可能需要关注不同轴布置。能够实现这些工具比较...
  • 基于分段线性表示时变数据可视化方法,王子慧,鄂海红,随着信息技术快速发展,时变数据普遍具有大规模,多维等属性。为清晰直观地展示时变数据,兼顾其本身属性和时间维度有序性,
  • 数据可视化 (1)可视化 (1)可视化的含义 定义 可视化是一种使复杂信息能够容易和快速被人理解的手段,是一种聚焦在信息重要特征的信息压缩,是可以放大人类感知的图形化表示方法。 可视化为人类大脑与...
  • 探索数据 汇总统计 频率和众数 分类属性众数是具有最高频率值 百分位数 位置度量:均值和中位数 截断均值 ... 可视化 动机 一般概念 表示:将数据映射到图形元素 安排 选择
  • python绘制多组多维数据雷达图 所使用数据如下所示:每一行是一个样本,每个样本有4维特征(列)。 封装一个雷达图绘图方法: import numpy as np import matplotlib.pyplot as plt from matplotlib ...
  • 可视化(Visualization)是利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理理论、方法和技术。可视化特点:1、可视化可以较快传递信息,多维的展示数据。2、可视化...
  • 可视化(Visualization)是利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理理论、方法和技术。可视化特点:1、可视化可以较快传递信息,多维的展示数据。2、可视化...
  • 可视化(Visualization)是利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理理论、方法和技术。可视化特点:1、可视化可以较快传递信息,多维的展示数据。2、可视化...
  • 链接:... 提取码:fb0c # -*- coding: utf-8 -*- #多维柱形图绘制方法: import numpy import pandas import matplotlib from matplotlib import pyplot as plt font = { '...
  • 如何做好数据可视化分析?

    万次阅读 2018-08-17 17:10:41
    数据可视化的实质是借助图形化手段,清晰有效的传达与沟通信息,使通过数据表达的内容更容易被理解。 那么,怎样来分析大量、复杂和多维的数据呢?答案是要提供直观的、可交互的和反应灵敏的可视化环境。因此,数据...
  • 数据可视化之美

    2017-10-25 23:29:23
    基本的可视化展现方式,如条形图、折线图、饼图、雷达图可以很容易通过...如果对地理空间数据、社会网络关系、多维数据进行可视化,直观地传递数据期望表达信息是需要特定图表类型来展示。 让我们一起来看几个
  • 数据可视化数据可视化(Data Visualization)是指运用计算机图形学和图像处理技术,将数据转换为图形或图像在屏幕上显示出来,并进行交互处理理论、方法和技术。它涉及计算机图形学、图像处理、计算机辅助设计、...
  • 简要介绍了数据挖掘、聚类分析及多维数据可视化,提出将Kmeans算法输出多维结果集通过主分量分析转换为3D空间点坐标,实现数据挖掘结果可视化。
  • 高维数据可视化 数据变换 降低维度:  使用线性或非线性变换把高维数据投影到低维空间 投影保留重要关系(无信息损失;保持数据区分等) 方法: 线性方法 主成分分析(PCA) 多维尺度分析...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 172
精华内容 68
关键字:

多维数据可视化的方法