如何为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
关键修改说明
- 新增导入:导入
toList(将Vector转为普通列表)和textTick(创建文本类型的刻度对象) - 定义标签列表:
labels中的每个元素对应ts里的一个条形位置 - 设置自定义刻度:通过
zip将X轴位置与文本标签配对,再用setTicks替换默认刻度 - 调整X轴范围:将X轴上限从5改为6,避免最右侧的标签被图表边缘遮挡
内容的提问来源于stack exchange,提问作者Pompan
相关产品推荐
相关产品推荐

