![如何保持 x 轴和 y 轴的比例为 1:1](https://linux22.com/image/251629/%E5%A6%82%E4%BD%95%E4%BF%9D%E6%8C%81%20x%20%E8%BD%B4%E5%92%8C%20y%20%E8%BD%B4%E7%9A%84%E6%AF%94%E4%BE%8B%E4%B8%BA%201%3A1.png)
我已经花了好几个小时寻找如何解决这些小问题的方法,最后我承认失败并谦虚地寻求帮助。最近我一直在检查我画得很糟糕的一些人物,试图把它们弄干净等等。
\documentclass[10pt,a4paper]{article}
\usepackage{tikz,tkz-euclide,pgfplots}
\usetkzobj{all}
\begin{document}
\begin{tikzpicture}[x=0.02cm,y=0.02cm,scale=0.8]
\tkzInit[ymin=-40,ymax=390,xmin=-40,xmax=540]
\tkzClip
\draw[help lines,ultra thin,dashed,gray!50!white] (-50,-50) grid (550,400);
\coordinate [label=below right:{50}] (x_1) at (50,0);
\coordinate [label=below right:{}] (B) at (0,390);
\coordinate [label=above right:{\large $y$}] (U) at (0,350);
\coordinate [label=above left:{\large $x$}] (A) at (540,0);
\coordinate [label=below right:{50}] (x_1) at (50,0);
\coordinate [label=below right:{100}] (x_2) at (100,0);
\coordinate [label=below right:{150}] (x_3) at (150,0);
\coordinate [label=below right:{200}] (x_4) at (200,0);
\coordinate [label=below right:{250}] (x_5) at (250,0);
\coordinate [label=below right:{300}] (x_6) at (300,0);
\coordinate [label=below right:{350}] (x_7) at (350,0);
\coordinate [label=below right:{400}] (x_8) at (400,0);
\coordinate [label=below right:{450}] (x_9) at (450,0);
\coordinate [label=below right:{500}] (x_10) at (500,0);
\coordinate [label=below right:{0}] (O) at (0,0);
\coordinate [label=above left:{50}] (y_1) at (0,50);
\coordinate [label=above left:{100}] (y_2) at (0,100);
\coordinate [label=above left:{150}] (y_3) at (0,150);
\coordinate [label=above left:{200}] (y_4) at (0,200);
\coordinate [label=above left:{250}] (y_5) at (0,250);
\coordinate [label=above left:{300}] (y_6) at (0,300);
\coordinate [label=above left:{350}] (y_7) at (0,350);
\coordinate [label=above left:{\bf Kostnader per m{\aa}ned (kroner)}] (R) at (400,350);
\coordinate [label=above left:{\bf Ringetid (minutter)}] (K) at (540,20);
\tkzDefPoint(0,-50){C}
\tkzDefPoint(-50,0){D}
\tkzDefPoint(0,87.50){S}
\tkzDefPoint(500,337.50){T}
\tkzDrawSegment[thick,-stealth](D,A)
\tkzDrawSegment[thick,-stealth](C,B)
\tkzDrawSegment[ultra thick,red](S,T)
\end{tikzpicture}
\vspace*{2ex}
\begin{tikzpicture}
\begin{axis}[
scale only axis,
grid=major,
grid style={dashed, gray!40},
axis lines=middle,
inner axis line style={-stealth},
xlabel={\begin{tabular}{@{}r@{}}\bf Ringetid (minutter)\\ \large $x$\end{tabular}},
ylabel={\large $y$ \ \ \normalsize \bf Kostnader per m{\aa}ned (kroner)},
ytick={0,50,...,350},
xtick={0,50,...,500},
x tick label style={below right},
y tick label style={above left,},
ymin=-50,
ymax=380,
xmin=-50,
xmax=550,
]
\addplot[color=red,very thick] coordinates { (0, 75) (500, 340)};
\end{axis}
\end{tikzpicture}
\end{document}
第一张图片的代码比较乱,但输出结果正是我想要的。我尝试清理代码,但遇到了很多问题。
我的主要问题是如何保持 x 轴和 y 轴之间的比率,有什么办法吗?
(现在,我对 x 和 y 标签以及轴的粗细也有一些问题,但我想这可以等待另一个答案......)。任何其他关于改进的提示都很好。=)
答案1
有三个选项:
- 您可以指定
axis equal
(或等效地),通过扩大轴范围,unit vector ratio=1 1 1
使轴单位相同,同时保持绘图尺寸(由width
和设置)不变。height
- 您可以指定
axis equal image
(或等效地unit vector ratio*=1 1 1
),这将使轴单位相同,但不保持图的尺寸。轴限值不会改变。 - 您可以自己明确指定单位向量长度,使用类似
x=0.015cm, y=0.015cm
。这样,绘图尺寸将取决于轴限值。根据我的经验,如果您有多个带有条形图的轴,并且条目数不同,这可能会很有趣。通过指定单位向量的长度,ybar
具有 20 个条目的轴的宽度将是具有 10 个条目的轴的两倍,同时保持条形之间的距离不变。
在这种情况下,我会选择第二种选择,因为您可能更关心轴限制而不是图的精确尺寸。
要获取0
刻度标签,您必须使用一些解决方法,如中所述需要对 pgfplots 轴做一些更改。
对于多行 x 标签,您不需要使用表格:您可以简单地插入\\
并使用设置节点的对齐方式xlabel style={align=right}
。
\documentclass[10pt,a4paper]{article}
\usepackage{pgfplots,relsize}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
unit vector ratio*=1 1 1,
width=11cm,
grid=major,
grid style={dashed, gray!30},
axis lines=middle, enlargelimits=false,
inner axis line style={-stealth},
xlabel={
\textbf{Ringetid (minutter)}\\\large $x$
},
xlabel style={
anchor=south east,
align=right
},
ylabel={\large $y$ \ \ \normalsize \bf Kostnader per måned (kroner)},
ytick={0,50,...,350},
xtick={0,50,...,500},
x tick label style={below right},
y tick label style={above left,},
ymin=-50,
ymax=380,
xmin=-50,
xmax=550,
after end axis/.code={
\path (axis cs:0,0)
node [anchor=north west,yshift=-0.075cm] {0}
node [anchor=south east,xshift=-0.075cm] {0};
}
]
\addplot[color=red,very thick] coordinates {
(0, 75)
(500, 340)
};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
我不是专家,但对于 tkz-euclide ,pgfplots
我可以提出一些改进建议。您可以使用一些特定的宏:\tkzgrid
、、和。\tkzLabelX
\tkzLabelY
\tkzDrawX
\tkzDrawY
您不需要[x=0.02cm,y=0.02cm]
但可以使用scale=0.8
。
\documentclass[10pt,a4paper]{article}
\usepackage{tikz,tkz-euclide}
\usetkzobj{all}
\begin{document}
\begin{tikzpicture}
\tkzInit[ymin=0,ymax=390,xstep=50,ystep=50,xmin=0,xmax=540]
\tkzGrid
\tkzLabelX[orig=false,label options={below right}]
\tkzLabelY[orig=false]
\tkzDrawX[below left =22 pt,label={\textbf{Ringetid (minutter)}}]
\tkzDrawY[right=12 pt,label={\textbf{Kostnader per m{\aa}ned (kroner)}}]
\tkzDefPoint(0,87.50){S}
\tkzDefPoint(500,337.50){T}
\tkzDrawSegment[ultra thick,red](S,T)
\end{tikzpicture}
\end{document}