Reputation: 510
I got to the stage in data analysis, where I need to show multiple dimensions in a single plot in order to better emphasize correlations. Placing a pie-chart for every data point would be the best way to go. Appended here a figure I found at: https://andypope.info/charts/piedatamarkers.htm
How can I produce such a graph in Gnuplot 5.2? I know it is not possible by standard plot types, I am looking for a workaround. I would go along loops and using Python to make a script that generates such a plot.
Upvotes: 1
Views: 422
Reputation: 26068
Here is a slightly simplified variation of the example mentioned here, especially the plot command is shorter and clearer.
The radius of the pie-charts are either fixed: value>0 in column3 or or automatic: value<0 in column3. In the latter case, the area of the circle is proportional to the total sum of the columns.
The arc colors can be chosen as 0xRRGGBB
colors. This example may serve as a starting point for further improvements and adaptions.
Code:
### 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($3)):(ArcFrom(j)):(ArcTo(j)):(ArcColor(j)) w circle lc rgb var notitle
### end of code
Result:
Upvotes: 1