合并gnuplot中的键条目 [英] Merge key entries in gnuplot

查看:48
本文介绍了合并gnuplot中的键条目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用不同颜色的线和点绘制数据.似乎存在不同的解决方案:

I would like to plot data with lines and points with different colors. It seems to exist different solutions:

  • https://stackoverflow.com/a/31887351/4373898 , https://stackoverflow.com/a/31562632/4373898
  • https://gnuplot-tricks.blogspot.fr/2009/12/defining-some-new-plot-styles.html

但是,它们中的任何一个都不能正确处理键,仅显示一条带有线和不同颜色点的条目... 还有另一种方法可以实现它吗?

However, none of them handle the key properly, showing only one entry with both the line and a point with different colors... Is there another way to achieve it?

这是最小的(非工作示例).

This is minimal (non-)working example.

set key bottom right
plot '+' using 1:1 title "same data with different lines and points color" with lines lc 'blue', '' using 1:1 every 3 notitle with points ps 1.2 pt 7 lc 'red';

亲切的问候, 亚历克西斯.

Kind regards, Alexis.

推荐答案

感谢ewcz为您的答案,迈向预期结果的第一步.但是,正如您所说的,如果要在同一图上显示多个函数/数据,则要适应它会有些棘手.

Thanks ewcz for your answer, it is a first step toward the expected result. However, as you stated it, this is a little bit trickier to adapt it if you have multiple functions/data to display on the same plot.

下面是一个最小的工作示例,它具有两个功能(因此有两个键项),并具有不同颜色的线,点和点轮廓.

Below is a minimal working example with two functions (and thus, two key entries) with a line, points, and points outline of different colors.

# These parameters are used to compute the spacing between entries of the key
pointSize = 1;
yticsScale = 1;
# We use the default spacing (1.25)
keySpacing = pointSize*yticsScale*1.25;

# Initial coordinate of the key
keyY = 4; # In character system
keyX = 0.87; # In graph system

# Just to generate data
set samples 20;
set xrange [-pi:pi];

set term pngcairo;
set output 'graph.png';
set xlabel "x"
set ylabel "y"

# Set the alignment (and thus the coordinate point) of the key
# Set the spacing to -1 to stack different (thanks to ewcz for the idea)
set key bottom right spacing -1

# Start a multiplot
set multiplot
# Make plots as big as possible
set origin 0,0
set size 1,1

# Set the key position
set key at graph keyX, character keyY

# Plot multiple times the same function with different styles.
# Make sure that all functions have a title (empty if necessary).
plot cos(x+pi) w l lc "light-red", \
     cos(x+pi) w p pt 5 ps 1.8 lc "dark-red" t ' ', \
     cos(x+pi) w p pt 5 ps 1.2 lc "red" t ' '
# Update key coordinates for the next plot
keyY = keyY + keySpacing

# Draw the key of the next plot at the new coordinates
set key at graph keyX, character keyY
plot cos(x) w l lc "light-blue", \
     cos(x) w p pt 7 ps 1.8 lc "dark-blue" t ' ', \
     cos(x) w p pt 7 ps 1.2 lc "blue" t ' ';

# That's all
unset multiplot
set output;

结果图:

希望对别人有帮助.

亲切的问候.

亚历克西斯

如果两个函数/数据都具有相同的范围(在x和y上),则自动代码可以正常工作.

The previous code works if both functions/data have the same ranges (on x and y) allowing autoscale to work properly.

对于不知道范围的数据,必须在绘制之前对其进行计算.

In the case of data where you do not know the ranges, you must compute it before plotting.

# Just to generate data
set samples 20;

# First data will be defined on [-pi:pi] with values between -1 and 1.
set table '1.dat'
plot [-pi:pi] cos(x)
unset table
# Second data will be defined on [-pi/2,pi/2] with values between 0 and -2
set table '2.dat'
plot [-pi/2:pi/2] 2*cos(x+pi)
unset table

# These parameters are used to compute the spacing between entries of the key
pointSize = 1;
yticsScale = 1;
keySpacingScale = 1.25; # Gnuplot default spacing
keySpacing = pointSize * yticsScale * keySpacingScale; # Spacing computation

set pointsize pointSize;
set ytics scale yticsScale;
set key spacing -1; # Make key entries overlapping (thanks ewcz for the idea)

# Initial coordinate of the key
keyY = 4.5; # In character system
keyX = 0.98; # In graph system

set term pngcairo;
set output 'graph.png';

# Remove redundant objects
# Borders, labels, tics will be drawn for each plot, this is not necessary as all plots will be stacked. So remove then.
set border 0
set tics textcolor "white" # Dirty tricks to keep plots aligned but to not show the tics
set xlabel " " # The same
set ylabel " " # The same

# Compute the ranges
min(v1, v2) = (v1 < v2) ? v1 : v2;
max(v1, v2) = (v1 > v2) ? v1 : v2;
# Get min and max for the data
stats [*:*] [*:*] '1.dat' name 'f1' nooutput;
stats [*:*] [*:*] '2.dat' name 'f2' nooutput;
# Get the range limits
xmin = min(f1_min_x, f2_min_x)
xmax = max(f1_max_x, f2_max_x)
ymin = min(f1_min_y, f2_min_y)
ymax = max(f1_max_y, f2_max_y)
# Autoscale the range to match all the data
set xrange [* < xmin:xmax < *] writeback
set yrange [* < ymin:ymax < *] writeback

# Start a multiplot
set multiplot
# Make plots as big as possible
set origin 0,0
set size 1,1

# Set the key
set key bottom right at graph keyX, character keyY

# Plot multiple times the same function with different styles.
# Make sure that all functions have a title (empty if necessary).
plot '1.dat' w l lc "light-red" t "cos(x)", \
          '' w p pt 5 ps 1.8 lc "dark-red" t ' ', \
          '' w p pt 5 ps 1.2 lc "red" t ' '

# Update key coordinates for the next plot
keyY = keyY + keySpacing
# Draw the key of the next plot at the new coordinates
set key at graph keyX, character keyY

# Display at least once the labels
set border
set tics textcolor "black"
set xlabel "x"
set ylabel "y"

# Disable ranges autoscaling
set xrange restore
set yrange restore

plot '2.dat' w l lc "light-blue" t "2cos(x+pi)", \
          '' w p pt 5 ps 1.8 lc "dark-blue" t ' ', \
          '' w p pt 5 ps 1.2 lc "blue" t ' '

# That's all
unset multiplot
set output;

再一次生成结果图:

One more time the resulting plots:

亲切的问候,

亚历克西斯

这篇关于合并gnuplot中的键条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆