"Pie chart"-类似于 Gnuplot 中散点图的数据点
"Pie chart"-like data point for scatter diagram in Gnuplot
我到了数据分析阶段,我需要在一个图中显示多个维度,以便更好地强调相关性。为每个数据点放置一个饼图是最好的方法。在此处附加我在以下位置找到的数字:https://andypope.info/charts/piedatamarkers.htm
如何在 Gnuplot 5.2 中生成这样的图表?我知道标准绘图类型是不可能的,我正在寻找解决方法。我会循环并使用 Python 制作一个脚本来生成这样的情节。
这里是上述示例的稍微简化的变体here,尤其是 plot 命令更短更清晰。
饼图的半径是固定的:column3 中的值>0 或自动的:column3 中的值<0。在后一种情况下,圆的面积与列的总和成正比。
圆弧颜色可以选择 0xRRGGBB
种颜色。此示例可作为进一步改进和调整的起点。
代码:
### plot with piecharts as points
reset session
$Data <<EOD
# x y r c1 c2 c3 c4 c5
2 16 -1 1.0 1.0 1.0 0.5 3.0
3 5 -1 0.8 0.7 0.5 0.9 0.8
7 15 -1 1.5 1.3 1.4 2.1 1.2
11 10 -1 5.6 8.7 3.1 3.1 9.4
12 19 -1 1.7 2.5 3.3 1.0 0.9
17 3 -1 4.1 5.1 1.4 0.5 5.3
19 14 -1 0.1 0.2 0.3 0.4 0.5
22 17 -1 2.1 2.2 3.2 4.2 1.5
EOD
stats $Data nooutput # get the number of columns
colMax = STATS_columns
colMin = 4 # starting column for data
Scale = 0.3 # general scaling of circles
set angle degrees
Part(i) = sum [col=colMin:i] column(col)
Total(n) = Part(colMax)
Radius(r) = Scale * (r<0 ? sqrt(Total(0)) : r) # radius<0: automatic calculation, proportional to sqrt
ArcStart = 90 # pie-chart start angle: 90=twelve o'clock
ArcDir = -1 # direction: -1 = clockwise, 1 = counterclockwise
ArcFrom(i) = ArcDir*Part(int(i)+(ArcDir<0?0:-1))/Total(0)*360 + ArcStart
ArcTo(i) = ArcDir*Part(int(i)+(ArcDir<0?-1:0))/Total(0)*360 + ArcStart
ArcColor(i) = int(word("0xff0000 0x00ff00 0x0000ff 0xff00ff 0xffff00",i-colMin+1))
set xrange[0:25]
set yrange[0:25]
set grid xtics, ytics
set style fill solid 0.5 noborder
plot for [j=colMin:colMax] $Data u 1:2:(Radius()):(ArcFrom(j)):(ArcTo(j)):(ArcColor(j)) w circle lc rgb var notitle
### end of code
结果:
我到了数据分析阶段,我需要在一个图中显示多个维度,以便更好地强调相关性。为每个数据点放置一个饼图是最好的方法。在此处附加我在以下位置找到的数字:https://andypope.info/charts/piedatamarkers.htm
如何在 Gnuplot 5.2 中生成这样的图表?我知道标准绘图类型是不可能的,我正在寻找解决方法。我会循环并使用 Python 制作一个脚本来生成这样的情节。
这里是上述示例的稍微简化的变体here,尤其是 plot 命令更短更清晰。
饼图的半径是固定的:column3 中的值>0 或自动的:column3 中的值<0。在后一种情况下,圆的面积与列的总和成正比。
圆弧颜色可以选择 0xRRGGBB
种颜色。此示例可作为进一步改进和调整的起点。
代码:
### plot with piecharts as points
reset session
$Data <<EOD
# x y r c1 c2 c3 c4 c5
2 16 -1 1.0 1.0 1.0 0.5 3.0
3 5 -1 0.8 0.7 0.5 0.9 0.8
7 15 -1 1.5 1.3 1.4 2.1 1.2
11 10 -1 5.6 8.7 3.1 3.1 9.4
12 19 -1 1.7 2.5 3.3 1.0 0.9
17 3 -1 4.1 5.1 1.4 0.5 5.3
19 14 -1 0.1 0.2 0.3 0.4 0.5
22 17 -1 2.1 2.2 3.2 4.2 1.5
EOD
stats $Data nooutput # get the number of columns
colMax = STATS_columns
colMin = 4 # starting column for data
Scale = 0.3 # general scaling of circles
set angle degrees
Part(i) = sum [col=colMin:i] column(col)
Total(n) = Part(colMax)
Radius(r) = Scale * (r<0 ? sqrt(Total(0)) : r) # radius<0: automatic calculation, proportional to sqrt
ArcStart = 90 # pie-chart start angle: 90=twelve o'clock
ArcDir = -1 # direction: -1 = clockwise, 1 = counterclockwise
ArcFrom(i) = ArcDir*Part(int(i)+(ArcDir<0?0:-1))/Total(0)*360 + ArcStart
ArcTo(i) = ArcDir*Part(int(i)+(ArcDir<0?-1:0))/Total(0)*360 + ArcStart
ArcColor(i) = int(word("0xff0000 0x00ff00 0x0000ff 0xff00ff 0xffff00",i-colMin+1))
set xrange[0:25]
set yrange[0:25]
set grid xtics, ytics
set style fill solid 0.5 noborder
plot for [j=colMin:colMax] $Data u 1:2:(Radius()):(ArcFrom(j)):(ArcTo(j)):(ArcColor(j)) w circle lc rgb var notitle
### end of code
结果: