You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Haskell plot库绘制的条形图X轴添加字符串标签?

如何在Haskell plot库的条形图X轴设置字符串刻度

使用plot库绘制条形图时,若想将X轴默认的数值刻度(如"1.00")替换为"A"、"B"、"C"这类自定义字符串标签,可通过自定义X轴刻度实现。

你的原始代码如下:

import Graphics.Rendering.Plot.Figure
import Graphics.Rendering.Plot.Render
import Numeric.LinearAlgebra (vector, Vector)

test_bar :: Figure ()
test_bar = do
    let ts = vector [1..5] :: Vector Double
        ds = vector [1..5] :: Vector Double
        barWidth = 10 :: Double
        barBorder = 2 :: Double

    setPlots 1 1
    withPlot (1,1) $ do
        setDataset (ts,[bar ds (barWidth, grey::Color,barBorder)])
        addAxis XAxis (Side Lower) $ withAxisLabel $ setText "X-axis"
        addAxis YAxis (Side Lower) $ withAxisLabel $ setText "Y-axis"
        setRange XAxis Lower Linear 0 5
        setRange YAxis Lower Linear 0 5

main :: IO ()
main = do writeFigure PNG "bars.png" (w,h) test_bar
    where 
        w = 800
        h = 600

修改方案

核心是利用setTicks函数绑定X轴位置与自定义字符串标签,具体修改如下:

import Graphics.Rendering.Plot.Figure
import Graphics.Rendering.Plot.Render
import Numeric.LinearAlgebra (vector, Vector, toList)
import Graphics.Rendering.Plot.Types (textTick)

test_bar :: Figure ()
test_bar = do
    let ts = vector [1..5] :: Vector Double
        ds = vector [1..5] :: Vector Double
        barWidth = 10 :: Double
        barBorder = 2 :: Double
        -- 定义与条形位置对应的字符串标签
        labels = ["A", "B", "C", "D", "E"]

    setPlots 1 1
    withPlot (1,1) $ do
        setDataset (ts,[bar ds (barWidth, grey::Color,barBorder)])
        -- 配置X轴,添加自定义刻度
        addAxis XAxis (Side Lower) $ do
            withAxisLabel $ setText "X-axis"
            -- 将每个条形的X位置与标签绑定,生成自定义刻度
            let customTicks = zip (toList ts) (map textTick labels)
            setTicks customTicks
        addAxis YAxis (Side Lower) $ withAxisLabel $ setText "Y-axis"
        -- 调整X轴范围,避免右侧标签被截断
        setRange XAxis Lower Linear 0 6
        setRange YAxis Lower Linear 0 5

main :: IO ()
main = writeFigure PNG "bars.png" (w,h) test_bar
    where 
        w = 800
        h = 600

关键修改说明

  1. 新增导入:导入toList(将Vector转为普通列表)和textTick(创建文本类型的刻度对象)
  2. 定义标签列表:labels中的每个元素对应ts里的一个条形位置
  3. 设置自定义刻度:通过zip将X轴位置与文本标签配对,再用setTicks替换默认刻度
  4. 调整X轴范围:将X轴上限从5改为6,避免最右侧的标签被图表边缘遮挡

内容的提问来源于stack exchange,提问作者Pompan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:46:32