使用gnuplot绘制CSV文件时出现x range is invalid错误的解决方法
问题描述
我的CSV文件内容如下:
Sections,Score text,5.80653548846 rdata,3.96936179484 data,0.378703493488 pdata,1.97732827586 rsrc,2.81352566021 reloc,0.46347168954
执行以下gnuplot命令:
gnuplot -p -e "set datafile separator ','; plot '/temp_files/iMiHRlrcQLwWYXjbjmTydBITw_PlotGraph.csv' using 1:2 with lines;"
收到错误:
line 0: warning: Skipping data file with no valid points set datafile separator ','; plot '/temp_files/iMiHRlrcQLwWYXjbjmTydBITw_PlotGraph.csv' using 1:2 with lines; ^ line 0: x range is invalid
已尝试的操作:
- 移除CSV文件的表头
Sections,Score; - 通过
set xlabel "Sections"; set ylabel "Scores";设置坐标轴标签; - 执行命令
set title "Entropy"; set grid; plot "FILENAME"; using 0:1 with lines; - 参考相关技术帖子的建议
期望生成的图表样式类似:
8 7 得分 6 5 4 3 |\ ___ 2 | \ / 1 | \____/ 0 | text rdata data 分区
解决方案
问题核心是x轴是字符串类型(text、rdata这类分区名称),gnuplot无法直接将字符串作为数值x轴绘制线条图。正确做法是用行号作为x轴数值索引,再把第一列的字符串设置为x轴刻度标签,具体命令如下:
带表头的CSV直接绘制命令
如果保留CSV表头,需要让gnuplot跳过第一行,同时指定x轴刻度:
gnuplot -p -e "set datafile separator ','; set xtics rotate by -45 right; plot '/temp_files/iMiHRlrcQLwWYXjbjmTydBITw_PlotGraph.csv' skip 1 using 0:2 with linespoints title '得分', '' skip 1 using 0:2:xtic(1) notitle;"
无表头的CSV绘制命令
如果已经移除了表头,命令可以简化:
gnuplot -p -e "set datafile separator ','; set xtics rotate by -45 right; plot '/temp_files/iMiHRlrcQLwWYXjbjmTydBITw_PlotGraph.csv' using 0:2 with linespoints title '得分', '' using 0:2:xtic(1) notitle;"
命令解释
skip 1:跳过CSV第一行表头(未移除表头时必须添加);using 0:2:用**第0列(从0开始的行号,作为数值型x轴)**对应第2列的得分作为y轴;using 0:2:xtic(1):把第一列的分区名称设置为对应x轴的刻度标签;set xtics rotate by -45 right:旋转x轴标签45度,避免名称重叠;linespoints:同时显示线条和数据点,更清晰呈现每个分区的得分;
额外优化(可选)
如果要添加标题、坐标轴标签和网格,完整命令如下:
gnuplot -p -e "set datafile separator ','; set title '熵值分布'; set xlabel '分区'; set ylabel '得分'; set grid; set xtics rotate by -45 right; plot '/temp_files/iMiHRlrcQLwWYXjbjmTydBITw_PlotGraph.csv' skip 1 using 0:2 with linespoints title '得分', '' skip 1 using 0:2:xtic(1) notitle;"
内容的提问来源于stack exchange,提问作者user12969777
相关产品推荐
相关产品推荐

