是否可以将图表中的星号与 X 轴上当天的第二位数字对齐?

Is it possible to align the asterisk in my chart with the second digit of the day on the X axis?

提问人:Memo Costecho 提问时间:11/5/2023 最后编辑:Memo Costecho 更新时间:11/7/2023 访问量:44

问:

我正在控制台应用程序中工作并尝试在 C# 控制台中绘制图表,但我无法将标记与 X 轴上的值对齐,我尝试在星号上添加间距,但什么都没有,有什么想法吗?我应该用循环来做

理想情况下,我想在 X 轴上打印值的第二位数字上方的标记

这是存储在数组 values[] 和 dates[] 中的数据作为参考

Date,       values 
10-21-2023, 12.3
10-22-2023, 11.9
10-23-2023, 13.6
10-24-2023, 11.9
10-25-2023, 10.8

这是我的代码:

 static void PlotGraph(double[] values, string[] dates, int counter)
}

     foreach (var value in distincthValues)
     {
         //print pH values in the Y-axis
         Console.Write($"{value:0.0}| ");

         for (int i = 0; i < count; i++)
         {
             if (values[i] == value)
             {
                 3748("  * ");
             } 
             else
             {
                 Console.Write("  ");
             }
         }
         Console.WriteLine();
     }

     Console.WriteLine("----------------------");
     Console.Write("Day|  ");
     
     for (int i = 0; i < counter; i++)
     {
         Console.Write($"{dates[i].Substring(3, 2)}  ");
     }

     Console.ReadLine();


 }

这就是我得到的:


13.6|     *
12.3| *
11.9|   *   *
10.8|         *
0.0|
----------------------
Day|  21  22  23  24  25
C# 数组控制台 应用程序

评论

0赞 phatfingers 11/5/2023
条件的两个语句应具有相同数量的字符,无论是打印空白还是星号。Console.writepHValues[i] == value

答:

2赞 Sweeper 11/5/2023 #1

X 轴上日期的第二位数字彼此相距均为 3 个字符。对齐 Y 轴后,您需要做的就是重复打印一个空格/星形,后跟 3 个空格。

要对齐 Y 轴,您可以通过查找具有最多字符的 ph 值来找到其宽度(当然,如果您知道这些值必须在某个范围内,则有更快的方法):

var yAxisWidth = distinctPhValues
    .Select(x => $"{x:0.0}".Length).Max();

然后,您可以使用(或者如果您想要左对齐)来打印 ph 值。PadLeftPadRight

foreach (var value in distinctPhValues)
{
    //print pH values in the Y-axis
    Console.Write($"{value:0.0}".PadLeft(yAxisWidth));
    Console.Write("|  "); // note I added an extra space here to account for the first digit of the first date
    for (int i = 0; i < pHValues.Length; i++)
    {
        if (pHValues[i] == value)
        {
            Console.Write("*");
        } 
        else
        {
            Console.Write(" ");
        }
        Console.Write("   "); // the stars are all 3 spaces apart from each other
    }
    Console.WriteLine();
}

xAxis 的长度很容易计算 - 乘以每个日期占用的字符数(即 4),然后将 Y 轴的宽度加到其中dates.Length

Console.WriteLine(new string('-', yAxisWidth + 4 * dates.Length));
Console.Write("Day".PadLeft(yAxisWidth));
Console.Write("| ");

for (int i = 0; i < dates.Length; i++)
{
    // consider actually using a DateTime/DateOnly instead of strings to represent dates
    // then you can do:
    // Console.Write($"{dates[i].Day,2}  ");
    Console.Write($"{dates[i].Substring(3, 2)}  ");
}

用法示例:

DisplayChart(
    new double[] {
        12.3, 11.9, 13.6, 11.9, 10.8
    },
    new string[] {
        "10-21-2023",
        "10-22-2023",
        "10-23-2023",
        "10-24-2023",
        "10-25-2023",
    }
);

输出示例:

13.6|          *           
12.3|  *                   
11.9|      *       *       
10.8|                  *   
------------------------
 Day| 21  22  23  24  25

评论

0赞 Memo Costecho 11/5/2023
这太棒了,它打印的图表看起来排列得很好。我设法以与制作动态分隔符类似的方式改进了 X 轴,但无法自己计算对齐方式。非常感谢你是救命稻草,