Method of Characteristics:
Examples

The quasilinear first order PDE uu_x+u_t = 0

A rarefaction wave

u[x_,t_]=x/(1+t)

Plot[{0+0 t, 0.25+0.25 t,0.5+0.5 t, 0.75+0.75 t,1+t},{t,0,1},PlotStyle->{{Thick,Black},{Thick,Black},{Thick,Black},{Thick,Black}},AspectRatio->Automatic]

rare1=Show[Plot3D[u[x,t],{x,-1,2},{t,0,1},BoxRatios->Automatic],Graphics3D[{Red,Arrowheads[0.1],Arrow[Tube[{{0,0,0},{0,1.5,0}},0.05]]}],Graphics3D[{Red,Arrowheads[0.1],Arrow[Tube[{{0,0,0},{2.1,0,0}},0.05]]}],Graphics3D[{Red,Arrowheads[0.1],Arrow[Tube[{{0,0,0},{0,0,2}},0.05]]}],PlotRange->All]

Show[rare1,Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.25,0,0.25},{0.25+0.25,1,0.25}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.5,0,0.5},{0.5+0.5,1,0.5}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.75,0,0.75},{0.75+0.75,1,0.75}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{1,0,1},{2,1,1}},0.05]]}],PlotRange->All]

Show[rare1,Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.25,0,0.25},{0.25+0.25,1,0.25}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.5,0,0.5},{0.5+0.5,1,0.5}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.75,0,0.75},{0.75+0.75,1,0.75}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{1,0,1},{2,1,1}},0.05]]}],ParametricPlot3D[{0.25+0.25 t,t,0},{t,0,1},PlotStyle->{Thick,Black}],ParametricPlot3D[{0.5+0.5 t,t,0},{t,0,1},PlotStyle->{Thick,Black}],ParametricPlot3D[{0.75+0.75 t,t,0},{t,0,1},PlotStyle->{Thick,Black}],ParametricPlot3D[{1+ t,t,0},{t,0,1},PlotStyle->{Thick,Black}],PlotRange->All]

A compression wave

u[x_,t_]=(1-x)/(1-t)

Plot[{0+(1-0) t, 0.25+(1-0.25) t,0.5+(1-0.5) t, 0.75+(1-0.75) t,1},{t,0,1},PlotStyle->{{Thick,Black},{Thick,Black},{Thick,Black},{Thick,Black}},AspectRatio->Automatic]

compress1=Show[Plot3D[u[x,t],{x,-1,2},{t,0,1},BoxRatios->Automatic],Graphics3D[{Red,Arrowheads[0.1],Arrow[Tube[{{0,0,0},{0,1.3,0}},0.05]]}],Graphics3D[{Red,Arrowheads[0.1],Arrow[Tube[{{0,0,0},{1.5,0,0}},0.05]]}],Graphics3D[{Red,Arrowheads[0.1],Arrow[Tube[{{0,0,0},{0,0,1.5}},0.05]]}],PlotRange->{0,1.5}]

Show[compress1,Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0,0,1},{1,1,1}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.25,0,1-0.25},{0.25+(1-0.25),1,1-0.25}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.5,0,0.5},{0.5+0.5,1,0.5}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.75,0,1-0.75},{0.75+(1-0.75),1,1-0.75}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{1,0,0},{1,1,0}},0.05]]}]]

Show[compress1,Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0,0,1},{1,1,1}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.25,0,1-0.25},{0.25+(1-0.25),1,1-0.25}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.5,0,0.5},{0.5+0.5,1,0.5}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{0.75,0,1-0.75},{0.75+(1-0.75),1,1-0.75}},0.05]]}],Graphics3D[{Blue,Arrowheads[0.1],Arrow[Tube[{{1,0,0},{1,1,0}},0.05]]}],ParametricPlot3D[{0+ t,t,0},{t,0,1},PlotStyle->{Thick,Black}],ParametricPlot3D[{0.25+(1-0.25) t,t,0},{t,0,1},PlotStyle->{Thick,Black}],ParametricPlot3D[{0.5+(1-0.5) t,t,0},{t,0,1},PlotStyle->{Thick,Black}],ParametricPlot3D[{0.75+(1-0.75) t,t,0},{t,0,1},PlotStyle->{Thick,Black}],ParametricPlot3D[{1,t,0},{t,0,1},PlotStyle->{Thick,Black}]]

The (nonhomogeneous) linear first order PDE 

x^2u_x+u_t = t

u[x_,t_]=(x/(x t+1))^2 + t^2/2

Plot3D[u[x,t],{x,0,1},{t,0,1},BoxRatios->Automatic]

The Characteristics

char1=Plot[0,{t,0,6},PlotStyle->{Thick,Black}]

char2=Plot[-0.25/(1-(-0.25)t),{t,0,6},PlotStyle->{Thick,Black}]

char3=Plot[-0.5/(1-(-0.5)t),{t,0,6},PlotStyle->{Thick,Black}]

char4=Plot[-0.75/(1-(-0.75)t),{t,0,6},PlotStyle->{Thick,Black}]

char5=Plot[-1/(1-(-1)t),{t,0,6},PlotStyle->{Thick,Black}]

chara=Plot[0.25/(1-(0.25)t),{t,0,1/0.25},PlotStyle->{Thick,Black}]

charb=Plot[0.5/(1-(0.5)t),{t,0,1/0.5},PlotStyle->{Thick,Black}]

charc=Plot[0.75/(1-(0.75)t),{t,0,1/0.75},PlotStyle->{Thick,Black}]

chard=Plot[1/(1-(1)t),{t,0,1/1},PlotStyle->{Thick,Black}]

Show[char1,char2,char3,char4,char5,chara,charb,charc,chard,PlotRange->{{0,4},{-1,12}}]

Show[char1,char2,char3,char4,char5,chara,charb,charc,chard,ParametricPlot[{-x,1/x},{x,-3,0},PlotStyle->{Thick,Red}],PlotRange->{{0,4},{-3,12}}]