玉玦图
玉玦图的简介
玦[jué]:半环形有缺口的佩玉,古代常用以赠人表示决绝。
玉玦图(又名,环形柱状图),是柱状图关于笛卡尔坐标系转换到极坐标系的仿射变换。其意义和用法与柱状图类似。
玉玦图有半价反馈效应。由于玉玦图中是用角度表示每个玦环数值的大小,角度是决定性因素。所以,哪怕外侧(半径大的)玦环的数值小于内侧(半径小的)玦环,外侧的每个玦环会相对的比里面的玦环更长。这会造成视觉上的误解。
而且因为我们的视觉系统更善于比较直线,所以笛卡尔坐标系更适合于比较各个分类的数值比较。所以玉玦图从实用的角度去看,其更多的是一种审美上的需求。
英文名:Radial bar chart
玉玦图的构成
一个完整的玉玦图包含以下构成元素:
- 玦环:角度表示数值
- 文本:数值、分类名
玉玦图的应用场景
适合的场景
例子1: 下图反应了美国民众对不同领域中的中美问题关注程度。
问题 | 关注人数比例 |
---|---|
台海关系 | 0.21 |
中国持续增长的军事力量 | 0.47 |
中国对全球环境的影响 | 0.49 |
…… | …… |
中国持有美国巨额国债 | 0.67 |
var data = [
{question: '台海关系',percent: 0.21, odd: 0},
{question: '中国持续增长的军事力量',percent: 0.47, odd: 1},
{question: '中国对全球环境的影响',percent: 0.49, odd: 0},
{question: '美国对中国的贸易逆差',percent: 0.52, odd: 1},
{question: '中国的人权政策',percent: 0.53, odd: 0},
{question: '来自中国的网络攻击',percent: 0.54, odd: 1},
{question: '中国带走了美国的就业岗位',percent: 0.60, odd: 0},
{question: '中国持有美国巨额国债',percent: 0.67, odd: 1}
];
var Stat = G2.Stat;
var Frame = G2.Frame;
var frame = new Frame(data); // 加工数据
var chart = new G2.Chart({
id: 'c1',
forceFit: true,
height: 500
});
chart.source(frame);
chart.col('odd',{
type: 'cat',
values: ['奇数','偶数']
});
chart.coord('polar',{inner: 0.1}).transpose();
chart.col('percent',{min: 0,max: 1});
chart.interval().position('question*percent')
.color('odd',['rgb(211,0,57)','rgb(224,74,116)'])
.label('percent',{offset: -1, label: {fontWeight: 'bold'}});
frame.each(function(obj){
chart.guide().text([obj.question,0],obj.question + ' ',{
'text-anchor' : 'end'
});
});
chart.render();
例子2: 下图反应了各国人民认为气候变化是严重问题的比例。
国家 | 关注人数比例 |
---|---|
巴西 | 0.86 |
印度 | 0.76 |
智利 | 0.76 |
…… | …… |
中国 | 0.18 |
var data = [
{country:'巴西', percent:0.86},
{country:'印度', percent:0.76,},
{country:'智利', percent:0.76,},
{country:'乌干达', percent:0.76,},
{country:'菲律宾', percent:0.72,},
{country:'越南', percent:0.69,},
{country:'法国', percent:0.56,},
{country:'德国', percent:0.55,},
{country:'加拿大', percent:0.51,},
{country:'韩国', percent:0.48,},
{country:'美国', percent:0.45,},
{country:'日本', percent:0.45,},
{country:'澳大利亚', percent:0.43,},
{country:'英国', percent:0.41,},
{country:'俄罗斯', percent:0.33,},
{country:'中国', percent:0.18,},
{country:'平均', percent:0.54,}
];
data.sort(function(o1,o2){
return o1.percent - o2.percent;
});
var Stat = G2.Stat;
var Frame = G2.Frame;
var frame = new Frame(data); // 加工数据
frame.addCol('condition', function(obj){
if (obj.country === '中国'){
return 1;
} else if(obj.country === '平均'){
return 2;
} else {
return 0;
}
});
var chart = new G2.Chart({
id: 'c1.1',
forceFit: true,
height: 500,
plotCfg: {margin: [0,0,40,0]}
});
chart.source(frame);
chart.coord('polar',{
inner: 0.1,
startAngle: -1 * Math.PI,
endAngle: -0.25 * Math.PI
}).transpose();
chart.col('condition',{
type: 'cat',
values: ['一般','特殊','平均']
});
chart.intervalStack()
.position("country*percent")
.color('condition',['#2370AE','#A34265','#505051'])
.label('percent').size(20);
frame.each(function(obj){
chart.guide().text([obj.country,0],obj.country + ' ',{
'text-anchor' : 'start',
'rotate': 90
});
});
chart.render();
玉玦图的误用场景
简介中提到玉玦图具有半径反馈效应。视觉上半径越大的玦环会看起来更大,半径小的则小。造成玉玦图的误用(见左图)。所以,我们认为玉玦图使用时必须进行排序(见右图)。
错误
正确
var data = [
{country:'巴西', percent:0.86},
{country:'印度', percent:0.76,},
{country:'智利', percent:0.76,},
{country:'乌干达', percent:0.76,},
{country:'菲律宾', percent:0.72,},
{country:'越南', percent:0.69,},
{country:'法国', percent:0.56,},
{country:'德国', percent:0.55,},
{country:'加拿大', percent:0.51,},
{country:'韩国', percent:0.48,},
{country:'美国', percent:0.45,},
{country:'日本', percent:0.45,},
{country:'澳大利亚', percent:0.43,},
{country:'英国', percent:0.41,},
{country:'俄罗斯', percent:0.33,},
{country:'中国', percent:0.18,},
{country:'平均', percent:0.54,}
];
var Stat = G2.Stat;
var Frame = G2.Frame;
var frame = new Frame(data); // 加工数据
frame.addCol('condition', function(obj){
if (obj.country === '中国'){
return 1;
} else if(obj.country === '平均'){
return 2;
} else {
return 0;
}
});
var chart = new G2.Chart({
id: 'c2',
width:400,
height: 420,
plotCfg: {margin: [0]}
});
chart.coord('polar',{
inner: 0.1,
startAngle: -1 * Math.PI,
endAngle: -0.25 * Math.PI
}).transpose();
chart.col('condition',{
type: 'cat',
values: ['一般','特殊','平均']
});
chart.source(frame);
chart.intervalStack()
.position("country*percent")
.color('condition',['#2370AE','#A34265','#505051'])
.label('percent').size(8);
frame.each(function(obj){
chart.guide().text([obj.country,0],obj.country + ' ',{
'text-anchor' : 'start',
'rotate': 90
});
});
chart.render();
var data = [
{country:'巴西', percent:0.86},
{country:'印度', percent:0.76,},
{country:'智利', percent:0.76,},
{country:'乌干达', percent:0.76,},
{country:'菲律宾', percent:0.72,},
{country:'越南', percent:0.69,},
{country:'法国', percent:0.56,},
{country:'德国', percent:0.55,},
{country:'加拿大', percent:0.51,},
{country:'韩国', percent:0.48,},
{country:'美国', percent:0.45,},
{country:'日本', percent:0.45,},
{country:'澳大利亚', percent:0.43,},
{country:'英国', percent:0.41,},
{country:'俄罗斯', percent:0.33,},
{country:'中国', percent:0.18,},
{country:'平均', percent:0.54,}
];
data.sort(function(o1,o2){
return o1.percent - o2.percent;
});
var Stat = G2.Stat;
var Frame = G2.Frame;
var frame = new Frame(data); // 加工数据
frame.addCol('condition', function(obj){
if (obj.country === '中国'){
return 1;
} else if(obj.country === '平均'){
return 2;
} else {
return 0;
}
});
var chart = new G2.Chart({
id: 'c3',
width:400,
height: 420,
plotCfg: {margin: 0}
});
chart.coord('polar',{
inner: 0.1,
startAngle: -1 * Math.PI,
endAngle: -0.25 * Math.PI
}).transpose();
chart.col('condition',{
type: 'cat',
values: ['一般','特殊','平均']
});
chart.source(frame);
chart.intervalStack()
.position("country*percent")
.color('condition',['#2370AE','#A34265','#505051'])
.label('percent').size(8);
frame.each(function(obj){
chart.guide().text([obj.country,0],obj.country + ' ',{
'text-anchor' : 'start',
'rotate': 90
});
});
chart.render();