如何在TMS FNC Charts中为两个系列共用一组坐标轴?
解决Delphi图表重复坐标轴问题
你的图表出现左侧和底部重复坐标轴的原因是:每个新增的Series默认会自动创建一套独立的X/Y坐标轴,两个Series就会生成两组重复的坐标轴。下面是两种解决方法,推荐使用第一种:
方法1:让多个Series共用同一组坐标轴(推荐)
在创建第二个Series(最高温系列)后,将它的X、Y坐标轴绑定到第一个Series的坐标轴,或者直接绑定到图表的主坐标轴,这样就不会生成新的重复坐标轴。
修改后的完整代码如下:
procedure TForm1.Button1Click(Sender: TObject); const CMin: array[1..31] of Double = ( 15, 16, 14, 13, 15, 17, 16, 14, 13, 12, 15, 16, 18, 17, 16, 14, 15, 18, 19, 17, 16, 15, 14, 13, 12, 14, 15, 17, 16, 15, 14 ); CMax: array[1..31] of Double = ( 28, 29, 30, 27, 26, 31, 32, 29, 28, 27, 30, 31, 33, 32, 31, 29, 30, 33, 34, 32, 31, 30, 29, 28, 27, 29, 30, 32, 31, 30, 29 ); begin var lYear := 2025; var lMonth := 10; var lDaysInMonth := DaysInAMonth(lYear, lMonth); TemperatureChart.BeginUpdate; try TemperatureChart.Series.Clear; // Min series var sMin := TemperatureChart.Series.Add; sMin.LegendText := 'Min (°C)'; sMin.XValues.MajorUnit := 1; sMin.XValues.MajorUnitFormat := '%.0f'; sMin.YValues.MajorUnitFormat := '%.0f'; // Max series var sMax := TemperatureChart.Series.Add; sMax.LegendText := 'Max (°C)'; // 关键:让最高温系列共用最低温系列的坐标轴 sMax.XAxis := sMin.XAxis; sMax.YAxis := sMin.YAxis; sMax.XValues.MajorUnit := 1; sMax.XValues.MajorUnitFormat := '%.0f'; sMax.YValues.MajorUnitFormat := '%.0f'; // Add points for each day of the selected month for var d := 1 to lDaysInMonth do begin with sMin.Points.Add do begin XValue := d; YValue := CMin[d]; end; with sMax.Points.Add do begin XValue := d; YValue := CMax[d]; end; end; // Update chart title var lMonthName := FormatDateTime('mmm', EncodeDate(lYear, lMonth, 1)); TemperatureChart.Title.Text := Format('Temperature (Test Data) - %s %d', [lMonthName, lYear]); finally TemperatureChart.EndUpdate; end; end;
你也可以直接绑定到图表的主坐标轴,效果一样:
// 替换上面的两行绑定代码 sMax.XAxis := TemperatureChart.Axes.Bottom; sMax.YAxis := TemperatureChart.Axes.Left;
方法2:直接隐藏多余的坐标轴
如果已经生成了重复坐标轴,可以通过设置对应坐标轴的Visible属性为False来隐藏。需要注意坐标轴的索引顺序(默认第一个Series对应索引0、1的X/Y轴,第二个对应2、3):
// 在Chart.EndUpdate之前添加 TemperatureChart.Axes.Items[2].Visible := False; // 隐藏第二个X轴(底部) TemperatureChart.Axes.Items[3].Visible := False; // 隐藏第二个Y轴(左侧)
这种方法适合临时处理,但如果后续新增Series,可能会再次生成重复坐标轴,因此更推荐方法1。
内容的提问来源于stack exchange,提问作者user31362432
相关产品推荐
相关产品推荐

