Is this intercept-free regression line really correct? I know there are many arguments against intercept-free regression but we are very interested in the convex or concave shape of these lines. Because I got suspicious real results, I switched my thinking hat from EDA to SW testing and found clearly wrong results with straight lines from degenerated ns, bs, and for default poly even worse, but people tell me it is my misunderstanding of intercept and orthogonal and not a bug.
(I know poly with raw=TRUE does not have this problem)

x <- c(0.2,1,2,3) # minor change in first point
y <- c(0.2,1,2,3)
fs <- lm(y ~ 0+splines::bs(x, degree=1))
fp <- lm(y ~ 0+poly(x, 1))
plot(x,y)
lines(x,fitted(fs), col="blue")
lines(x,fitted(fp), col="red")
summary(fs)
summary(fp)
sessionInfo()

This is the session info:
R version 4.1.1 (2021-08-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19043)
Matrix products: default
locale:
1 LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
1 splines   stats     graphics  grDevices utils     datasets  methods   base
other attached packages:
1 onls_0.1-1       minpack.lm_1.2-1
loaded via a namespace (and not attached):
1 compiler_4.1.1 tools_4.1.1



I admit it was my misunderstanding of orthogonal polynomials. Now I see the default, orthogonal, poly by definition can not be intercept-free so specifying 0+ results only in erroneously leaving out the necessary intercept term from the model.
